1. 设置cuda synchronize的等待模式
- 参考资料:https://docs.nvidia.com/cuda/pdf/CUDA_Runtime_API.pdf
cuda的 synchronize等待模式分为: Yield方式, busy waiting方式(spin), blocking方式
- busy waiting (spin): 是一直占用cpu,属于轮训式等待
- yield:是让出时间片,将时间片轮空,可能会导致很多切入切出
- blocking:方式会导致线程阻塞,从而让出cpu,等待stream上的gpu操作结束后,会触发block 的cpu线程/进程,然后恢复执行;但是这个是被动唤醒模式;可能会导致block的cpu恢复产生延迟,从而产生空白时间,导致线程整体执行耗时增加。
前两个模式,在gpu操作完成后,cpu主线程会及时响应,从而继续往后执行;但是第三个会产生block空隙,如果主线程是FIFO这种实时线程,优先级高且抢占cpu资源,并且CPU资源充足的情况,则block的cpu线程会恢复较快但不排除存在延迟情况。
-
采用blocking模式后,nsight观察的现象有几个
- gpu context切换更加频繁了,应该是block阻塞导致的
- block恢复存在延迟,导致一些空白gpu时间,如下图红色框
<