在NVIDIA CUDA内核中创建数组

14

嗨,我想知道是否可以在nvidia cuda内核中进行以下操作

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[1000];
  ...
}
或者以下内容
__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}
4个回答

12
你可以做第一个例子,但我没有尝试过第二个。
然而,如果可能的话,你可能想重新设计你的程序,不要这样做。你不想在你的内核中分配4000字节的内存。那会导致大量使用CUDA本地内存,因为你无法将所有东西都装进寄存器中。CUDA本地内存很慢(内存延迟400个周期)。

2
这个问题的答案结合起来是非常有价值的。特别要注意Sebastian Dressler所指出的每个线程都会分配那4000字节的事实。因此,如果启动一个由1024个块组成的网格,每个块包含256个线程,则需要大约1GB的内存。 - harrism

11

你可以完成#1,但请注意这将在每个线程中都执行!

你的第二个代码片段不会起作用,因为内核运行时不支持动态内存分配。


10

当您启动内核时,可以动态分配共享内存。

__global__ void compute(long *c1, long size, ...)
 {
  ...
   extern __shared__ float shared[];
  ...
 }

compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );

CUDA编程指南:

数组的大小在启动时确定(见第4.2.3节)。


6

内核运行时支持动态内存分配,可以查看 SDK 示例中的 new delete 功能。


这是一种支持的方式,但是做事情的效率最低。在这里讨论:https://stackoverflow.com/a/13485322/1977614 我也遇到了20倍的性能下降。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接