CUDA如何在共享内存中的内核中运行时创建数组?

Ela*_*lan 1 cuda

我有运行大量线程的任务,每个线程都进行一次小矩阵乘法.所有小矩阵都已加载到全局内存中.我希望通过让每个线程将其小矩阵加载到共享内存中来提高性能,然后计算产品.但问题是我在编译期间不知道矩阵的大小.所以我无法创建变量__shared__ double mat1[XSIZE][YSIZE].在PC上,我会进行动态分配.但我不知道我是否可以在共享内存上执行此操作.如果在内核中调用malloc只会在全局内存中分配(假设这样的调用是可能的),那也无济于事.

有没有办法在内核运行时声明数组?有没有其他方法可以解决这个问题?

tal*_*ies 5

您可以在CUDA中声明动态大小的共享内存分配,如下所示

__global__ void kernel()
{
    extern __shared__ double *mat1;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样启动你的内核

kernel<<<grid,block,XSIZE*YSIZE*sizeof(double)>>>();
Run Code Online (Sandbox Code Playgroud)

这在CUDA编程指南中有更详细的讨论.

  • 不,它动态地为每个*块*分配共享内存.共享内存在CUDA中具有块范围,而不是线程范围. (3认同)