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>>>)。这指定了共享内存中除了静态分配的内存之外,为此调用动态分配的每个块的字节数。恕我直言,没有办法访问二维数组这样的内存,你必须使用一维数组并像二维一样使用它。最后想想,不要忘记 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 回答