2013-10-06 29 views
-1

我陷入了一件非常簡單的事情,我需要一個意見。我在CUDA一個非常簡單的內核副本兩個數組之間的所有元素(還有一個原因,我想這樣做,以這種方式)和在CUDA內核中的陣列之間移動元素

__global__ 
void kernelExample(float* A, float* B, float* C, int rows, int cols) 
{ 

    int r = blockIdx.y * blockDim.y + threadIdx.y; // vertical dim in block 
    int c = blockIdx.x * blockDim.x + threadIdx.x; // horizontal dim in block 

    if (r < rows && c < cols) { 
     // row-major order 
     C[ c + r*cols ] = A[ c + r*cols ]; 
    } 
    //__syncthreads(); 

} 

我以不令人滿意的結果。有什麼建議嗎?

內核被稱爲是這樣的:

int numElements = rows * cols; 
int threadsPerBlock = 256; 
int blocksPerGrid = ceil((double) numElements/threadsPerBlock); 
kernelExample<<<blocksPerGrid , threadsPerBlock >>>(d_A, d_B, d_C, rows, cols); 

更新(後Eric的幫助):

int numElements = rows * cols; 
int threadsPerBlock = 32; //talonmies comment 
int blocksPerGrid = ceil((double) numElements/threadsPerBlock); 
dim3 dimBlock(threadsPerBlock,threadsPerBlock); 
dim3 dimGrid(blocksPerGrid,blocksPerGrid); 
kernelExample<<<dimBlock, dimBlock>>>(d_A, d_B, d_C, rows, cols); 

例如具有矩陣A

A =[ 
0 1 
2 1 
0 2 
0 0 
2 0 
0 1 
2 1 
2 2 
2 2 
0 0 
2 1 
2 2 
3 1 
2 2 
2 2 
] 

返回矩陣C是

C = [ 
0 1 
2 1 
0 2 
0 0 
2 0 
0 1 
2 1 
2 2 
2 2 
0 0 
2 1 
2 2 
3 1 
2 2 
2 2 
] 
+1

「不滿意的結果」是什麼意思?請詳細描述您所遇到的問題。如果你不告訴我們問題是什麼,這很難幫助你...... – talonmies

+0

你的「更新」不可能是正確的 - 在每個CUDA GPU上,256x256塊大小都是非法的,所以內核贏得了' t發射。 – talonmies

+0

是的,你是對的talonmies抱歉錯誤的信息,但它的內核工作,發生了一件有趣的事情。我調試了代碼,我注意到網格被分成1x1個模塊。這意味着blockIdx.y = 0,...,14 blockIdx.x = 0,...,14,blockDim.y = 1,blockDim.x = 1,threadIdx.x = 0,threadIdx.y = 0。你是否必須更新帖子?再次感謝。 – Darkmoor

回答

1

C/C++默認使用基於0的索引。

嘗試

1)從

if (r <= rows && c <= cols) { 

if (r < rows && c < cols) { 

2)德爾__syncthreads();變化,因爲你不同意線程

3)糾正之間的數據塊和網格設置從一維到二維,因爲您同時使用.x.y在內核中

4)刪除float* B如果你不使用它。

來解決問題。

請參閱內核copy()位於cuda示例代碼中的以下文件以獲取更多信息。

$CUDA_HOME/samples/6_Advanced/transpose/transpose.cu 
+0

我編輯代碼並添加上面的示例。謝謝。 – Darkmoor

+0

「將塊和網格設置從1-D更正爲2-D,因爲您在內核中同時使用.x和.y來解決問題。」你的意思是dim3 dimBlock(threadsPerBlock,threadsPerBlock); dim3 dimGrid(blocksPerGrid,blocksPerGrid);如果是的,我做了一個編輯的例子。 – Darkmoor

+0

它工作!謝謝! – Darkmoor