假设我们通过调用cudaEventRecord记录了两个cuda事件A和B,那么在我们进行任何同步之前,有没有办法判断A是否必然发生在B之前或之后?例如,如果我有这些代码:
kernelA<<<1,1>>>(...);
cudaEventRecord(A, 0);
kernelB<<<1,1>>>(...);
cudaEventRecord(B, 0);
然后B应该在A之后发生,但是在给出两个手柄的情况下我怎么知道呢?换句话说,我将如何编写这样的函数:
bool judge_order(cudaEvent_t A, cudaEvent_t B) {...}
如果A在B之前发生,则返回true。
当我想创建一个内存管理器以便有效地重用已经在先前内核启动中使用的内存时,问题出现了。
答案 0 :(得分:1)
CUDA中的所有内容都安排在流上。这包括内核执行,内存传输和事件。默认情况下,所有操作都在流0上进行。
每个流都经过严格的线性处理。即在您的示例中,保证在处理eventA之前已完成kernelA。通过查询事件的状态,您可以判断它是否已经过处理而无需等待它。
然而,可以按任何顺序处理单独的流。如果您为每个内核/事件使用单独的流,则不保证特定的处理顺序。
所有这些都在CUDA编程指南中得到了更好的解释。