GPU 2D共享内存动态分配

Man*_*ete 7 cuda gpu gpgpu nvidia

我知道使用1D数组时的动态分配,但是如何在使用2D数组时完成?

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

__global__ void myKernerl(){
 __shared__ float sData[][];
     .....
}
Run Code Online (Sandbox Code Playgroud)

假设我要分配2D共享内存数组:

__shared__ float sData[32][32];
Run Code Online (Sandbox Code Playgroud)

怎么能动态完成?将会:

myKernel<<< blocks, threads, sizeof(float)*32*32 >>>();
Run Code Online (Sandbox Code Playgroud)

stu*_*hlo 5

正确编写后,必须在每个内核调用执行配置(in <<<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] = ...
   }
Run Code Online (Sandbox Code Playgroud)