我知道一维数组的动态分配,但是对于二维数组如何实现呢?
myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>();
....
__global__ void myKernel(){
__shared__ float sData[][];
.....
}
假设我想分配一个 2D 共享内存数组:
__shared__ float sData[32][32];
如何动态地完成它?会不会是:
myKernel<<< blocks, threads, sizeof(float)*32*32 >>>();
最佳答案
正如您所正确编写的那样,您必须在执行配置中调用每个内核之前指定动态分配的共享内存的大小(在 <<<blocks, threads, sizeofSharedMemoryinBytes>>>
中)。这指定了共享内存中的字节数
除了静态分配的内存之外,还会为此调用动态分配每个 block 。恕我直言,无法访问二维数组等内存,您必须使用一维数组并像二维一样使用它。最后想想,别忘了限定符 extern
。所以你的代码应该是这样的:
sizeofSharedMemoryinBytes = dimX * dimY * sizeof(float);
myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>();
....
__global__ void myKernerl() {
extern __shared__ float sData[];
.....
sData[dimX * y + x] = ...
}
关于cuda - GPU 2D共享内存动态分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13195766/