嗨,我只是想知道是否可以在 nvidia cuda 内核中执行以下操作
__global__ void compute(long *c1, long size, ...)
{
...
long d[1000];
...
}
或以下
__global__ void compute(long *c1, long size, ...)
{
...
long d[size];
...
}
你可以做第一个例子,第二个我没试过。
但是,如果您能提供帮助,您可能希望重新设计您的程序以不这样做。您不想在内核中分配 4000 字节的内存。这将导致大量使用 CUDA 本地内存,因为您无法将所有内容都放入寄存器中。CUDA 本地内存很慢(400 个内存延迟周期)。
你可以做#1,但要注意这将在每个线程中完成!
您的第二个片段将不起作用,因为不支持内核运行时的动态内存分配。
您可以在启动内核时动态分配共享内存。
__global__ void compute(long *c1, long size, ...)
{
...
extern __shared__ float shared[];
...
}
compute <<< dimGrid, dimBlock, sharedMemSize >>>( blah blah );
CUDA 编程指南:
数组的大小在启动时确定(参见第 4.2.3 节)。
支持内核运行时的动态内存分配,请查看 sdk 示例,新删除。