Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA如何在运行时在共享内存的内核中创建阵列?_Cuda - Fatal编程技术网

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中具有块作用域,而不是线程作用域。