8

1D 配列が使用されている場合の動的割り当ては認識していますが、2D 配列が使用されている場合はどうすればよいですか?

myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>();
         ....

__global__ void myKernerl(){
 __shared__ float sData[][];
     .....
}

2D 共有メモリ配列を割り当てたいとします。

__shared__ float sData[32][32];

どうすれば動的に実行できますか? だろう:

myKernel<<< blocks, threads, sizeof(float)*32*32 >>>();
4

1 に答える 1

5

あなたが正しく書いたように、各カーネルが実行の構成で呼び出す前に、動的に割り当てられた共有メモリのサイズを指定する必要があります(<<<blocks, threads, sizeofSharedMemoryinBytes>>>)。これは、静的に割り当てられたメモリに加えて、この呼び出しのブロックごとに動的に割り当てられる共有メモリ内のバイト数を指定します。私見には、2D配列などのメモリにアクセスする方法はありません。1D配列を使用し、2Dのように使用する必要があります。最後に、 qualifier を忘れないでくださいextern。したがって、コードは次のようになります。

   sizeofSharedMemoryinBytes = dimX * dimY * sizeof(float);

   myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>();
     ....

   __global__ void myKernerl() {

       extern __shared__ float sData[];
       .....
       sData[dimX * y + x] = ...
   }
于 2012-11-26T19:49:19.367 に答える