正如标题一样,有人可以让我更了解 CUDA 中的堆和堆栈吗?它与CPU内存中的原始堆和堆栈有什么不同吗?
我在 CUDA 中增加堆栈大小时遇到问题,它似乎有其局限性,因为当我将堆栈大小设置为 1024*300 (Tesla M2090) by 时cudaDeviceSetLimit,出现错误:argument invalid.
我想问的另一个问题是:当我将堆大小设置为非常大的数字(大约 2GB)以分配具有 2000 个元素的 RTree(数据结构)时,在运行时出现错误: too many resources requested to launch
任何的想法?
P/s:我只用单线程启动 ( kernel<<<1,1>>>)
堆栈是按线程分配的,并且有硬件限制(见下文)。 堆驻留在全局内存中,可以使用 malloc() 分配,并且必须使用 free() (CUDA doc )显式释放。
本设备功能:
void* malloc(size_t size);
void free(void* ptr);
Run Code Online (Sandbox Code Playgroud)
可能很有用,但我建议仅在真正需要它们时才使用它们。重新考虑使用主机端函数(如cudaMalloc)分配内存的代码是一种更好的方法。
的堆栈大小具有硬件限制,其可以被计算(根据这个答案由@njuffa)由最小的:
随着您增加大小,并且您只运行一个线程,我想您的问题是第二个限制,在您的情况下(TESLA M2090)应该是:6144/16/512 = 750KB。
所述堆具有必须的任何呼叫之前指定为固定大小(默认8MB)malloc()通过使用函数cudaDeviceSetLimit。请注意,由于一些分配开销,分配的内存将至少是请求的大小。另外值得一提的是,内存限制不是针对每个线程的,而是具有 CUDA 上下文的生命周期(直到通过调用 free() 释放),并且可以在随后的内核启动中由线程使用。
有关堆栈的相关帖子:...内核的堆栈帧,...每个 cuda 线程的本地内存
有关堆的相关帖子:... 堆内存 ... , ... 每个线程的堆内存限制