0

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.cppC++ コードと、ラッパーを呼び出す関数が含まれています。

4

1 に答える 1

1

extern 修飾子を使用する場合、カーネルの起動時に共有メモリのサイズを渡す必要があります。
kernel<<< blocks, threads, size>>>(...)
size パラメータは、バイト単位の共有メモリのサイズです。

于 2012-08-10T11:43:26.353 に答える