假设我们通过调用 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。
当我想制作内存管理器以有效地重用先前内核启动中已经使用的内存时,就会出现问题。
CUDA 中的所有内容都安排在流中。这包括内核执行、内存传输和事件。默认情况下,一切都在流 0 上运行。
每个流都严格线性处理。 即在您的示例中,保证在处理事件 A 之前已完成内核 A。通过查询事件的状态,您可以知道它是否已被处理,而无需等待它。
但是,可以按任何顺序处理单独的流。如果您为每个内核/事件使用单独的流,则无法保证特定的处理顺序。
所有这些都在 CUDA 编程指南中得到了更好的解释。