【问题标题】:GPU 2D shared memory dynamic allocationGPU 2D 共享内存动态分配
【发布时间】:2012-10-23 03:26:54
【问题描述】:

我知道使用一维数组的时候动态分配,但是使用二维数组的时候怎么做呢?

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

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

假设我要分配一个二维共享内存数组:

__shared__ float sData[32][32];

如何动态完成?应该是:

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

【问题讨论】:

  • 您静态声明的“2D 共享内存数组”不是二维的,它只是线性内存,编译器会生成对它的行优先顺序访问。根据您对多维数组的无数疑问,也许是时候坐下来阅读一些参考资料并了解数组在 C++ 中的工作原理了。..

标签: cuda gpu gpgpu nvidia


【解决方案1】:

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

   sizeofSharedMemoryinBytes = dimX * dimY * sizeof(float);

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

   __global__ void myKernerl() {

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

【讨论】:

  • 我也是这么想的。
猜你喜欢
  • 2021-04-12
  • 2016-10-21
  • 2011-07-12
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
相关资源
最近更新 更多