【问题标题】:CUDA how to create arrays in runtime in kernel in shared memory?CUDA如何在共享内存的内核中运行时创建数组?
【发布时间】:2026-01-06 03:00:02
【问题描述】:

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

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

【问题讨论】:

    标签: cuda


    【解决方案1】:

    您可以像这样在 CUDA 中声明动态大小的共享内存分配

    __global__ void kernel()
    {
        extern __shared__ double *mat1;
    }
    

    然后像这样启动你的内核

    kernel<<<grid,block,XSIZE*YSIZE*sizeof(double)>>>();
    

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

    【讨论】:

    • 此方法允许为每个线程动态分配相同数量的内存。我必须用不同大小的 matices 填充每个线程,我还不知道其上限和下限的大小。但是非常感谢您的回复和参考。这是一个很好的起点。是的,正如我从您的提示中发现的那样,它已在 B.16 节的编程指南中进行了讨论。
    • 不,它为每个block动态分配共享内存。共享内存在 CUDA 中具有块作用域,而不是线程作用域。