GPU 2D 共享内存动态分配

10

我知道如何动态分配一维数组,但是如何为二维数组进行动态分配呢?

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

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

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

__shared__ float sData[32][32];

如何动态地完成呢?是这样吗:

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

7
您静态声明的“2D共享内存数组”并不是二维的,它只是线性内存,并且编译器生成行优先顺序访问它。鉴于您关于多维数组的无尽问题,也许现在是时候坐下来阅读一些参考资料,学习C++中数组的工作原理了。 - talonmies
1个回答

6
正如您正确写的那样,在执行配置中,您必须在每次内核调用之前指定动态分配的共享内存大小(在<<<blocks, threads, sizeofSharedMemoryinBytes>>>中)。这指定了每次调用为此块动态分配的共享内存中的字节数,除了静态分配的内存之外。在我看来,没有办法将这种内存访问为二维数组,您必须使用一维数组并像使用二维数组一样使用它。最后一件事,不要忘记限定符extern。因此,您的代码应该像这样:
   sizeofSharedMemoryinBytes = dimX * dimY * sizeof(float);

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

   __global__ void myKernerl() {

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

这也是我所认为的。 - Ono

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接