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