2012-10-31 15 views
0

驻留弯曲的数量是否也受到用户指定堆大小的限制?了解GPU堆内存和驻留弯曲

例如,如果每个线程需要分配1 MB内存,并且堆设置为总共32 MB(我假设cudaLimitMallocHeapSize用于每个内核启动而不是每个线程的堆使用情况,那是正确?)。这是真的,只有一个warp是允许在设备上?

回答

1

内核启动(或发布warp或块)不会受堆大小的限制。相反,如果不能满足每个线程发出的线程(已达到每线程malloc,但不是相应的空闲)次请求分配的内核启动将失败。您可能希望参考CUDA C程序员指南的heap memory allocation section。每个线程分配示例代码在该部分中给出,您可以轻松修改该代码以证明自己的行为。只需调整启动的线程(或块)的堆大小和数量即可查看达到堆限制时的行为。是的,cudaLimitMallocHeapSize实际上用于整个设备上下文,所以它适用于在对cudaDeviceSetLimit()的相关调用之后发生的所有内核启动。这不是每个线程的限制。还要注意,有一些分配开销。设置一个128MB的堆大小并不意味着所有的128MB将可用于后续的设备malloc操作。提及设备malloc操作也只能在CC 2.0及以上版本中才有用。

+1

可能工作注意到,内核递归调用堆栈消耗运行时堆也是如此。 – talonmies