在 CUDA 图中使用循环
Using a loop in a CUDA graph
我有需要顺序执行的内核A、B、C。
A->B->C
它们在 while 循环中执行,直到满足某些条件。
while(predicate) {
A->B->C
}
while 循环可以执行 3 到 2000 次 - 关于循环应该停止的事实的信息由内核 C 生成。
由于执行与多次调用相对较小的内核有关,CUDA Graph 听起来是个好主意。但是,我看到的CUDA图形实现都是线性的或者树状的,没有循环。
一般来说,如果循环是不可能的,长度为 2000 的长链内核可以从内核 C 调用提前停止。但是,是否可以通过内核内部的调用在某个位置停止图形执行?
CUDA 图没有条件。图的一个顶点是visited/executed,当它的前辈完成时,就是这样。因此,从根本上说,您不能使用 CUDA 图来执行此操作。
你能做什么?
- 为循环迭代准备一个较小的图形,并重复安排它。
- 让 A、B 和 C 通过检查循环谓词开始执行 - 如果成立则跳过所有工作。在这种情况下,您可以安排 A->B-C->A->B->C 等的许多实例 - 从某个点开始,它们什么都不做。
- 不要依赖 CUDA 图 API。它不是通用的并行执行机制。 :-(
我有需要顺序执行的内核A、B、C。
A->B->C
它们在 while 循环中执行,直到满足某些条件。
while(predicate) {
A->B->C
}
while 循环可以执行 3 到 2000 次 - 关于循环应该停止的事实的信息由内核 C 生成。
由于执行与多次调用相对较小的内核有关,CUDA Graph 听起来是个好主意。但是,我看到的CUDA图形实现都是线性的或者树状的,没有循环。
一般来说,如果循环是不可能的,长度为 2000 的长链内核可以从内核 C 调用提前停止。但是,是否可以通过内核内部的调用在某个位置停止图形执行?
CUDA 图没有条件。图的一个顶点是visited/executed,当它的前辈完成时,就是这样。因此,从根本上说,您不能使用 CUDA 图来执行此操作。
你能做什么?
- 为循环迭代准备一个较小的图形,并重复安排它。
- 让 A、B 和 C 通过检查循环谓词开始执行 - 如果成立则跳过所有工作。在这种情况下,您可以安排 A->B-C->A->B->C 等的许多实例 - 从某个点开始,它们什么都不做。
- 不要依赖 CUDA 图 API。它不是通用的并行执行机制。 :-(