我陷入了一件非常簡單的事情,我需要一個意見。我在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
]
「不滿意的結果」是什麼意思?請詳細描述您所遇到的問題。如果你不告訴我們問題是什麼,這很難幫助你...... – talonmies
你的「更新」不可能是正確的 - 在每個CUDA GPU上,256x256塊大小都是非法的,所以內核贏得了' t發射。 – talonmies
是的,你是對的talonmies抱歉錯誤的信息,但它的內核工作,發生了一件有趣的事情。我調試了代碼,我注意到網格被分成1x1個模塊。這意味着blockIdx.y = 0,...,14 blockIdx.x = 0,...,14,blockDim.y = 1,blockDim.x = 1,threadIdx.x = 0,threadIdx.y = 0。你是否必須更新帖子?再次感謝。 – Darkmoor