13

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

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[1000];
  ...
}

或以下

__global__ void compute(long *c1, long size, ...)
{
  ...
  long d[size];
  ...
}
4

4 回答 4

12

你可以做第一个例子,第二个我没试过。

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

于 2010-02-02T22:03:08.090 回答
11

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

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

于 2010-02-10T17:04:37.740 回答
8

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

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

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

CUDA 编程指南:

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

于 2010-02-08T23:57:10.877 回答
7

支持内核运行时的动态内存分配,请查看 sdk 示例,新删除。

于 2012-04-29T19:52:37.237 回答