Cuda 动态并行性:可以创建的子线程的深度
Cuda dynamic parallelism: depth of children threads one can create
我正在阅读我觉得很密集的 CUDA 编程指南。我来到他们解释父网格可以创建子网格的部分,只有当其所有派生的子线程都完成时,父网格才被认为已完成。
我的问题是:在 Cuda 中允许父子树生长的“深度”是多少:这些是否仅受所讨论硬件的计算能力的限制,例如一个人可以产生尽可能多的 parent/children 线程块 he/she 想要,前提是我们不超过硬件上一次可以 运行 的最大线程数,或者是否有进一步的限制?我问这个是因为没有这个功能我看不出如何在 GPU 上实现递归。
谢谢,
胺
My question is: how "deep" is the parent-child tree allowed to grow in Cuda
documentation表示最大嵌套深度为24。
如文档中所述,在实际达到 24 的嵌套深度之前,您通常可能会首先遇到其他限制。其中之一是对设备内核启动的一般限制,包括内存要求以及启动挂起的限制。另一个可能的限制是同步限制。这与父内核是否显式等待子内核完成(例如通过 device-side cudaDeviceSynchronize()
,以及此同步扩展到什么深度有关。
provided we don't exceed the max number of threads that can run on the hardware at once
None 这明确取决于父内核或子内核中有多少线程。 CUDA 内核对硬件一次可以 运行 的线程数没有任何基本限制,CUDA 动态并行 (CDP) 也没有。
作为一个实际问题,大深度 CDP 发射可能 运行 进入各种限制。此外,从性能的角度来看,这样的设计模式可能不是最好的。 CDP 启动有与之相关的时间和资源开销,对于任何以这种方式细分工作的模式,通常希望在 CUDA 内核中在内核中做 more 工作,而不是更少。
我正在阅读我觉得很密集的 CUDA 编程指南。我来到他们解释父网格可以创建子网格的部分,只有当其所有派生的子线程都完成时,父网格才被认为已完成。
我的问题是:在 Cuda 中允许父子树生长的“深度”是多少:这些是否仅受所讨论硬件的计算能力的限制,例如一个人可以产生尽可能多的 parent/children 线程块 he/she 想要,前提是我们不超过硬件上一次可以 运行 的最大线程数,或者是否有进一步的限制?我问这个是因为没有这个功能我看不出如何在 GPU 上实现递归。
谢谢, 胺
My question is: how "deep" is the parent-child tree allowed to grow in Cuda
documentation表示最大嵌套深度为24。
如文档中所述,在实际达到 24 的嵌套深度之前,您通常可能会首先遇到其他限制。其中之一是对设备内核启动的一般限制,包括内存要求以及启动挂起的限制。另一个可能的限制是同步限制。这与父内核是否显式等待子内核完成(例如通过 device-side cudaDeviceSynchronize()
,以及此同步扩展到什么深度有关。
provided we don't exceed the max number of threads that can run on the hardware at once
None 这明确取决于父内核或子内核中有多少线程。 CUDA 内核对硬件一次可以 运行 的线程数没有任何基本限制,CUDA 动态并行 (CDP) 也没有。
作为一个实际问题,大深度 CDP 发射可能 运行 进入各种限制。此外,从性能的角度来看,这样的设计模式可能不是最好的。 CDP 启动有与之相关的时间和资源开销,对于任何以这种方式细分工作的模式,通常希望在 CUDA 内核中在内核中做 more 工作,而不是更少。