2011-04-13 37 views
15

我是CUDA的新手,需要幫助理解一些事情。我需要幫助將這兩個for循環並行化。特別是如何設置dimBlock和dimGrid以使其運行更快。我知道這看起來像sdk中的矢量添加示例,但該示例僅適用於矩形矩陣,並且當我嘗試修改該128 x 1024矩陣的代碼時,它無法正常工作。CUDA如何獲得網格,塊,線程大小和並行化非方矩陣計算

__global__ void mAdd(float* A, float* B, float* C) 
{ 
    for(int i = 0; i < 128; i++) 
    { 
     for(int i = 0; i < 1024; i++) 
     { 
      C[i * 1024 + j] = A[i * 1024 + j] + B[i * 1024 + j]; 
     } 
    } 
} 

此代碼是一個大循環的一部分,是代碼的最簡單的部分,所以我決定嘗試paralleize硫雜,並在同一時間學習CUDA。我已閱讀指南,但仍不明白如何獲得正確的答案。的網格/塊/線程去並有效地使用它們。

+5

在[pycuda](http://mathema.tician.de/software/pycuda)它僅僅是'C [I] = A [1] + B [i]於'[demo.py](HTTPS:/ /gist.github.com/916835) – jfs 2011-04-13 02:06:22

+2

(題外話)您現在有我的兩個循環索引(你忘了J) – 2017-04-04 12:45:50

回答

31

當你寫它,即內核是完全連續的。每個啓動執行它的線程都將執行相同的工作。

CUDA(以及OpenCL和其他類似的「單一程序,多數據」類型編程模型)背後的主要思想是您執行「數據並行」操作 - 因此必須執行相同的,基本上獨立的操作很多次 - 並編寫一個執行該操作的內核。然後啓動大量(半)自主線程來在輸入數據集上執行該操作。

在您的陣列另外例如,數據並行操作是

C[k] = A[k] + B[k]; 

爲0和128 * 1024每個加法操作是完全獨立的,並且沒有排序要求,並因此可以通過執行之間所有k一個不同的線程。在CUDA表達這一點,可能會寫這樣的內核:

__global__ void mAdd(float* A, float* B, float* C, int n) 
{ 
    int k = threadIdx.x + blockIdx.x * blockDim.x; 

    if (k < n) 
     C[k] = A[k] + B[k]; 
} 

[免責聲明:寫在瀏覽器的代碼,沒有測試過,用在自己的風險]

這裏,從內循環和外循環序列碼是由每一個操作線程CUDA更換,我已經在代碼中增加了一個限制檢查,以便在多個線程比所需的操作啓動的情況下,不會發生緩衝區溢出。如果內核然後推出這樣的:

const int n = 128 * 1024; 
int blocksize = 512; // value usually chosen by tuning and hardware constraints 
int nblocks = n/nthreads; // value determine by block size and total work 

madd<<<nblocks,blocksize>>>mAdd(A,B,C,n); 

然後256塊,每塊包含512個線程將被推出到GPU硬件並行執行所述陣列的加法運算。請注意,如果輸入數據大小不能表示爲塊大小的良好舍入倍數,則塊數將需要四捨五入以涵蓋整個輸入數據集。

以上全部是CUDA範式的一個很瑣碎的操作的一個非常簡單的概述,但也許是我們有足夠的洞察力讓你繼續自己。 CUDA是相當成熟,這些天,有很多漂浮你大概可以用它來進一步闡明許多的編程模型,我在這個答案掩蓋了各方面的網絡上良好,免費的教育材料。

+0

謝謝talonmies。這真的幫助我理解塊和網格的大小。我一直在做的所有閱讀都突然變得有意義。 – user656210 2011-04-13 23:53:59

+0

int k = threadIdx.x + gridDim.x * blockDim.x;這肯定是不正確的?在你的例子中,gridDim.x * blockDim.x總是256 * 512。應該是int k = threadIdx.x + blockIdx.x * blockDim.x;我試圖編輯它,但被拒絕。 – Ozone 2013-05-01 03:02:53

+0

@Ozone:是的,這是一個錯字,感謝您指出了它。 – talonmies 2013-05-01 06:09:18