私は非常に単純なことに行き詰まっており、意見が必要です。2 つの配列間で要素をコピーする 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 );
更新(エリックの助けの後):
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
]