CUDA:堆栈和堆

Hoa*_*ong 3 c c++ cuda

正如标题一样,有人可以让我更了解 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>>>)

ter*_*ill 7

关于栈和堆

堆栈是按线程分配的,并且有硬件限制(见下文)。 驻留在全局内存中,可以使用 malloc() 分配,并且必须使用 free() (CUDA doc )显式释放。

本设备功能:

void* malloc(size_t size);
void free(void* ptr);
Run Code Online (Sandbox Code Playgroud)

可能很有用,但我建议仅在真正需要它们时才使用它们。重新考虑使用主机端函数(如cudaMalloc)分配内存的代码是一种更好的方法。


堆栈大小具有硬件限制,其可以被计算(根据这个答案由@njuffa)由最小的:

  • 每个线程的本地内存量
  • 可用 GPU 内存/SM 数量/每个 SM 的最大常驻线程

随着您增加大小,并且您只运行一个线程,我想您的问题是第二个限制,在您的情况下(TESLA M2090)应该是:6144/16/512 = 750KB


所述具有必须的任何呼叫之前指定为固定大小(默认8MB)malloc()通过使用函数cudaDeviceSetLimit。请注意,由于一些分配开销,分配的内存将至少是请求的大小。另外值得一提的是,内存限制不是针对每个线程的,而是具有 CUDA 上下文的生命周期(直到通过调用 free() 释放),并且可以在随后的内核启动中由线程使用。

有关堆栈的相关帖子:...内核的堆栈帧...每个 cuda 线程的本地内存

有关堆的相关帖子:... 堆内存 ... , ... 每个线程的堆内存限制