GPU 2D共享内存动态分配

时间:2012-11-02 13:03:00

标签: cuda gpu gpgpu nvidia

我知道使用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 >>>();

1 个答案:

答案 0 :(得分:5)

正确编写后,必须在每个内核调用执行配置(<<<blocks, threads, sizeofSharedMemoryinBytes>>>)之前指定动态分配的共享内存的大小。这指定了共享内存中的字节数 除了静态分配的内存之外,还为每个块动态分配此调用。恕我直言,没有办法访问2D阵列这样的内存,你必须使用1D阵列,并像2D一样使用它。最后想一想,不要忘记限定符extern。所以你的代码应该是这样的:

   sizeofSharedMemoryinBytes = dimX * dimY * sizeof(float);

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

   __global__ void myKernerl() {

       extern __shared__ float sData[];
       .....
       sData[dimX * y + x] = ...
   }