-1

私は非常に単純なことに行き詰まっており、意見が必要です。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
]
4

1 に答える 1