我有大量线程在运行的任务,每个线程都进行一次小的矩阵乘法运算。所有小矩阵都已加载到全局内存中。我希望通过让每个线程将其小矩阵加载到共享内存中来提高性能,然后计算产品。但问题是我在编译期间不知道矩阵的大小。所以我不能像__shared__ double mat1[XSIZE][YSIZE]
那样创建变量。在PC上,我会进行动态分配。但我不知道我是否可以在共享内存上执行此操作。如果在内核中调用malloc只会在全局内存中分配(假设可以进行调用),那也无济于事。
有没有办法在内核运行时声明数组?有没有其他方法可以解决这个问题?
答案 0 :(得分:5)
您可以在CUDA中声明动态大小的共享内存分配,例如
__global__ void kernel()
{
extern __shared__ double *mat1;
}
然后像这样启动你的内核
kernel<<<grid,block,XSIZE*YSIZE*sizeof(double)>>>();
这在CUDA编程指南中有更详细的讨论。