在nvidia cuda内核中创建数组

kl.*_*kl. 10 c++ cuda nvidia

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

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[1000];
  ...
}
Run Code Online (Sandbox Code Playgroud)

或以下

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}
Run Code Online (Sandbox Code Playgroud)

tke*_*win 10

你可以做第一个例子,我没有尝试过第二个例子.

但是,如果您可以提供帮助,您可能需要重新设计程序而不是这样做.您不希望在内核中分配4000字节的内存.这将导致大量使用CUDA本地内存,因为您将无法将所有内容都安装到寄存器中.CUDA本地内存很慢(400个周期的内存延迟).

  • 这个问题的答案组合很有价值.特别要注意Sebastian Dressler的观点,即每个线程都会分配4000个字节.因此,如果您启动1024个块的网格,每个块256个线程,则需要大约1GB的内存. (2认同)

Seb*_*ler 9

你可以做#1,但要注意这将在每个线程中完成!

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


Jua*_*eni 6

启动内核时,可以动态分配共享内存.

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

compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );
Run Code Online (Sandbox Code Playgroud)

CUDA编程指南:

数组的大小在发布时确定(参见第4.2.3节).


小智 5

支持内核运行时的动态内存分配,请查看sdk示例,new delete.