CUDA阻止标志

时间:2011-01-27 22:42:47

标签: synchronization cuda

创建CUDA事件时,您可以选择打开cudaEventBlockingSync标志。但是 - 如果创建一个有或没有标志的事件之间的区别怎么办?我read the fine manual;它对我来说没有意义。什么是“调用主机线程”,以及当使用该标志时“阻止”什么?

  

4.6.2.7 cudaError_t cudaEventSynchronize(cudaEvent_t event)

     

阻止事件实际发生   被录音了。 ......等待   用the创建的事件    cudaEventBlockingSync 标志将导致   调用主机线程阻塞直到   该事件实际上已被记录下来。

2 个答案:

答案 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时间非常宝贵的服务器上运行此程序,或者您必须按单位时间付费,则此功能非常有用。