CUDA で共有メモリを試していて、このコードでの動作を理解していない場合。私はかなり基本的なカーネルを持っています:
__global__ void sum( int* input, int* output, int size){
int tid = threadIdx.x+blockDim.x*blockIdx.x +
blockDim.x*gridDim.x*blockIdx.y;
extern __shared__ int sdata[];
sdata[tid] = input[tid];
__syncthreads();
output[tid] = input[tid];
}
そして、出力はすべて 0 ですoutput[]
。ただし、コメントアウトするsdata[tid] = input[tid];
と、出力は問題なく等しくなりinput[]
ます。
ここで何が間違っていますか?何か不足していますか?
[アップデート]
タグを削除extern
して共有配列にサイズを指定すると、問題なく動作するようです。理由はありますか?
[更新] カーネルを呼び出す方法は C++ コードからであるため、メイン コードから呼び出すには、それをラップする必要がありました。
kernel.cu
カーネル自体とラッパー関数が含まれています。
void wrapper(int dBlock, int dThread, int* input, int* output, int size){
sum<<<dBlock,dThread>>>(input, output, size);
}
callerfunction.cpp
C++ コードと、ラッパーを呼び出す関数が含まれています。