创建CUDA事件时,您可以选择打开cudaEventBlockingSync
标志。但是 - 如果创建一个有或没有标志的事件之间的区别怎么办?我read the fine manual;它对我来说没有意义。什么是“调用主机线程”,以及当不使用该标志时“阻止”什么?
4.6.2.7 cudaError_t cudaEventSynchronize(cudaEvent_t event)
阻止事件实际发生 被录音了。 ......等待 用the创建的事件 cudaEventBlockingSync 标志将导致 调用主机线程阻塞直到 该事件实际上已被记录下来。
答案 0 :(得分:7)
cudaEventBlockingSync
将定义主机如何等待事件发生。
当cudaEventBlockingSync
设置时,CPU可以放弃主机线程。即CPU将传递一个不同的线程(可能是一个进程)。主机线程将在以后重新获取CPU。使用这种方法,主机线程不会独占所有CPU时间,主机可以被允许做其他工作。
当cudaEventBlockingSync
未设置时,CPU将忙等待,即CPU将进入检查事件循环。当发生这种情况时,CPU只是旋转,寻找事件发生。这通常会导致CPU性能指标达到100%。使用此方法,主机线程独占所有CPU时间。
未设置cudaEventBlockingSync
会导致从内核执行结束到返回到线程的控件的最小延迟。您要使用的设置取决于内核正在执行的操作。即事件发生需要多长时间,相比之下,CPU阻塞涉及多少调度开销。不设置此标志的代价是在等待事件发生时无法执行任何其他CPU工作(其他线程)。
答案 1 :(得分:4)
当你调用该函数时,线程将停止执行,直到该事件发生,此时程序继续。这是一种确保您了解正在运行的程序的状态的方法。这在CUDA中尤其重要,因为很多东西都是异步的。
“调用主机线程”是CUDA设备所在的主机CPU上运行的线程。
根据以下评论进行编辑:
我认为“阻塞同步”和常规同步之间的区别在于线程阻塞并且在事件完成之前不会运行,而不是在等待时“旋转”的线程,不断检查值。这意味着线程不会使用任何额外的CPU时间旋转,而是在事件完成后唤醒。例如,如果您在CPU时间非常宝贵的服务器上运行此程序,或者您必须按单位时间付费,则此功能非常有用。