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

发布于 2024-12-22 13:48:15 字数 281 浏览 1 评论 0原文

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

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

I have the task of large number of threads running, each doing a small matrix multiplication. All the small matrices have been loaded to the global memory. I wish to improve performance by letting each thread load its small matrices into shared memory, and then compute the product. But the problem is that I do not know the sizes of the matrices during compile time. So I cannot create variables as in __shared__ double mat1[XSIZE][YSIZE]. On PC, I would have made a dynamic allocation. But I do not know if I could do it on the shared memory. If calling malloc in a kernel would allocate only in global memory (assuming such a call is possible), that does not help either.

Is there a way to declare arrays during runtime in kernel? Is there any other way to resolve this problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

世界等同你 2024-12-29 13:48:15

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

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

然后像这样启动内核

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

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

You can declare dynamically sized shared memory allocations in CUDA, like this

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

And then launch your kernel like this

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

This is discussed in more detail in the CUDA programming guide.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文