在 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 图来执行此操作。

你能做什么?

  1. 为循环迭代准备一个较小的图形,并重复安排它。
  2. 让 A、B 和 C 通过检查循环谓词开始执行 - 如果成立则跳过所有工作。在这种情况下,您可以安排 A->B-C->A->B->C 等的许多实例 - 从某个点开始,它们什么都不做。
  3. 不要依赖 CUDA 图 API。它不是通用的并行执行机制。 :-(