【问题标题】:CUDA: stack and heapCUDA:堆栈和堆
【发布时间】:2016-04-20 01:37:41
【问题描述】:

如标题所示,有人可以对我了解更多关于 CUDA 中的堆和堆栈的信息吗?它与CPU内存中的原始堆和堆栈有什么不同吗?

当我在 CUDA 中增加堆栈大小时遇到​​问题,它似乎有其局限性,因为当我通过cudaDeviceSetLimit 将堆栈大小设置为超过 1024*300 (Tesla M2090) 时,我收到一个错误:argument invalid

我想问的另一个问题是:当我将堆大小设置为非常大的数字(大约 2GB)以分配我的 RTree(数据结构)有 2000 个元素时,运行时出现错误:too many resources requested to launch

有什么想法吗?

P/s:我只用单线程启动 (kernel<<<1,1>>>)

【问题讨论】:

  • “请求启动的资源过多”错误可能与您在内核中使用的寄存器和线程的数量有关。尝试通过将 -Xptxas="-v" 添加到编译行来打印使用情况。
  • 为什么需要增加栈/堆大小?请发布一个重现问题的示例。
  • 寻求调试帮助的问题(为什么这段代码不起作用?)预计将包含 MCVE。概念问题也不例外(为什么可能我的代码,我没有展示,失败了?)如果有这样的例外,那么每个人都可以使用它和 MCVE requirement将毫无意义。
  • 没有人想看到你的代码。我建议您先阅读MCVE 是什么。对于您在第二段和第三段中描述的两个问题,MCVE 可能只需要大约 20 行代码,也许更少。我认为在调用 cudaDeviceSetLimit 时演示 invalid argument 不需要 1000 行代码。

标签: c++ c cuda


【解决方案1】:

栈和堆是不同的东西。 Stack 表示每个线程堆栈,heap 表示设备 malloc/new 用于分配内存的每个上下文运行时堆。您使用cudaLimitStackSize 标志设置堆栈大小,使用cudaLimitMallocHeapSize 标志设置运行时堆,两者都传递给cudaDeviceSetLimit API

听起来您想要增加堆大小,但正在尝试通过更改堆栈大小来实现。另一方面,如果您需要较大的堆栈大小,则可能必须减少使用的每个块的线程数,以避免内核启动失败。

【讨论】:

  • “如果您需要较大的堆栈大小,您可能必须减少每个块的线程数”。我认为堆栈大小是硬件限制,juffa devtalk.nvidia.com/default/topic/642743/… 的这篇文章也证实了这一点。我错过了什么?
  • 不,我将它们都增加到非常大的大小(堆栈为 300Mb,堆为 2Gb)。我的代码是一个 RTree 结构,大约有 1000 多行,所以我不能在这里发布。我想要的只是将我的 RTree 移植到 GPU 内存上,但即使我增加到大尺寸,关于堆栈大小的错误仍然会发生
  • 我在问:如果堆栈大小受到物理限制,那么减少运行线程的数量会有什么帮助?如果您超过了物理尺寸(正如我认为在这个问题中发生的那样),那么启动也会因一个线程而失败。
  • 是的,我可能误解了,因为我已经在考虑 1 线程案例了,感谢您的澄清。
【解决方案2】:

关于栈和堆

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

此设备功能:

void* malloc(size_t size);
void free(void* ptr);

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


堆栈大小有一个硬件限制,可以通过以下最小值计算(根据answer by @njuffa):

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

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


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

堆栈上的相关帖子:... stack frame for kernels... local memory per cuda thread

堆上的相关帖子:... heap memory ...... heap memory limitations per thread

【讨论】:

    猜你喜欢
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2023-03-20
    • 2020-04-20
    • 2012-06-26
    • 1970-01-01
    • 2017-08-12
    相关资源
    最近更新 更多