GPU 2D 共享内存动态分配

Posted

技术标签:

【中文标题】GPU 2D 共享内存动态分配【英文标题】:GPU 2D shared memory dynamic allocation 【发布时间】: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++ 中的工作原理了。.. 【参考方案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] = ...
   

【讨论】:

我也是这么想的。

以上是关于GPU 2D 共享内存动态分配的主要内容,如果未能解决你的问题,请参考以下文章

C ++释放共享库中动态分配的内存导致崩溃

Linux-Ubuntu:具有动态分配变量的共享内存,必须由其他可执行文件更改

eCos 动态内存分配简介

nvidia cuda访问gpu共享内存

类和动态内存分配

是否可以使用 IPC 分配 2D 数组作为共享内存?