我知道使用1D数组时的动态分配,但是如何在使用2D数组时完成?
myKernel<<<blocks, threads,sizeofSharedMemoryinBytes>>>();
....
__global__ void myKernerl(){
__shared__ float sData[][];
.....
}
我想要分配一个2D共享内存数组:
__shared__ float sData[32][32];
如何动态完成?将是:
myKernel<<< blocks, threads, sizeof(float)*32*32 >>>();
答案 0 :(得分:5)
正确编写后,必须在每个内核调用执行配置(<<<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] = ...
}