CUDA如何在运行时在共享内存的内核中创建阵列?
我的任务是运行大量线程,每个线程执行一个小的矩阵乘法。所有小矩阵都已加载到全局内存中。我希望通过让每个线程将其小矩阵加载到共享内存中,然后计算乘积来提高性能。但问题是我不知道编译时矩阵的大小。因此,我无法创建CUDA如何在运行时在共享内存的内核中创建阵列?,cuda,Cuda,我的任务是运行大量线程,每个线程执行一个小的矩阵乘法。所有小矩阵都已加载到全局内存中。我希望通过让每个线程将其小矩阵加载到共享内存中,然后计算乘积来提高性能。但问题是我不知道编译时矩阵的大小。因此,我无法创建\uuuuuuuuuuuuuuuuuuuuuuuuuuuuudouble mat1[XSIZE][YSIZE]中的变量。在PC上,我会进行动态分配。但我不知道我是否能在共享内存上做到这一点。如果在内核中调用malloc将只在全局内存中分配(假设这样的调用是可能的),这也没有帮助 有没有办法在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuudouble mat1[XSIZE][YSIZE]
中的变量。在PC上,我会进行动态分配。但我不知道我是否能在共享内存上做到这一点。如果在内核中调用malloc将只在全局内存中分配(假设这样的调用是可能的),这也没有帮助
有没有办法在内核运行时声明数组?有没有其他方法可以解决此问题?您可以在CUDA中声明动态大小的共享内存分配,如下所示
__global__ void kernel()
{
extern __shared__ double *mat1;
}
kernel<<<grid,block,XSIZE*YSIZE*sizeof(double)>>>();
然后像这样启动内核
__global__ void kernel()
{
extern __shared__ double *mat1;
}
kernel<<<grid,block,XSIZE*YSIZE*sizeof(double)>>>();
kernel();
《CUDA编程指南》对此进行了更详细的讨论。您可以在CUDA中声明动态大小的共享内存分配,如下所示
__global__ void kernel()
{
extern __shared__ double *mat1;
}
kernel<<<grid,block,XSIZE*YSIZE*sizeof(double)>>>();
然后像这样启动内核
__global__ void kernel()
{
extern __shared__ double *mat1;
}
kernel<<<grid,block,XSIZE*YSIZE*sizeof(double)>>>();
kernel();
《CUDA编程指南》对此进行了更详细的讨论。此方法允许将相同数量的内存动态分配给每个线程。我必须用不同大小的材质填充每个线程,大小的上限和下限我还不知道。但非常感谢您的回复和参考。这是一个很好的起点。是的,正如我从您的提示中了解到的,它已经在B.16节的编程指南中讨论过。不,它动态地为每个块分配共享内存。共享内存在CUDA中具有块作用域,而不是线程作用域。此方法允许将相同数量的内存动态分配给每个线程。我必须用不同大小的材质填充每个线程,大小的上限和下限我还不知道。但非常感谢您的回复和参考。这是一个很好的起点。是的,正如我从您的提示中了解到的,它已经在B.16节的编程指南中讨论过。不,它动态地为每个块分配共享内存。共享内存在CUDA中具有块作用域,而不是线程作用域。