cuda-API相关

cudaEventSynchronize

Waits for an event to complete.

在 CUDA 编程中,cudaEventSynchronize(event) 被用来阻塞调用 CPU 线程,直到由 event 指定的事件被记录。当 GPU 中指定的任务完成时,事件将被记录。这里是更详细的分解:

当它阻塞时:函数阻塞调用线程,直到指定的事件被记录。如果事件与内核或内存操作相关联,cudaEventSynchronize 将阻塞直到该操作完成。这确保了任何依赖 GPU 任务的后续 CPU 操作可以安全地进行。

当它释放时:一旦 GPU 完成了与事件相关的任务并且事件被记录,函数将返回并且 CPU 线程被解除阻塞。这允许 CPU 线程继续执行,知道依赖的 GPU 任务已完成。

处理多次 cudaEventRecord 调用:是的,一个事件可以通过多次调用 cudaEventRecord 被多次记录。这在你需要同步 GPU 计算中的多个点时非常有用。然而,重要的是要注意,调用 cudaEventSynchronize 在这样的事件上会等待所有记录的任务(与该事件的所有 cudaEventRecord 调用相关联的任务)完成。在同一个事件上对 cudaEventRecord 的每次调用实际上都更新了事件,以反映流执行时间线中的最新点。因此,当你调用 cudaEventSynchronize 时,它确保了所有操作直到最近的 cudaEventRecord 都已完成。

  1. cudaEventRecord用于记录事件,而不会阻塞CPU线程。它将在GPU执行到达该事件时进行标记,以便后续可以使用该事件进行同步或测量时间间隔。
  2. cudaEventSynchronize用于阻塞CPU线程,直到指定的事件被记录。它确保CPU线程在GPU任务完成后继续执行,而不会提前执行依赖于GPU任务的操作。

cudaEventRecord

cudaEventRecord() 可以在同一个事件上多次调用,并将覆盖之前捕获的状态。其他 API 如 cudaStreamWaitEvent() 使用 API 调用时最近捕获的状态,并不受之后调用 cudaEventRecord() 的影响。在第一次调用 cudaEventRecord() 之前,一个事件代表一组空工作集,因此例如 cudaEventQuery() 将会返回 cudaSuccess。

参考