如上所述:How to reduce CUDA synchronize latency / delay
设备等待结果有两种方法:
-
"Polling" - 在旋转时刻录CPU - 在等待结果时减少延迟
-
"Blocking" - 线程正在休眠,直到发生中断 - 以提高一般性能
对于 "Polling" 需要使用 CudaDeviceScheduleSpin
.
但是对于 "Blocking" 我需要使用 CudaDeviceScheduleYield
或 cudaDeviceScheduleBlockingSync
?
cudaDeviceScheduleBlockingSync
与 cudaDeviceScheduleYield
有什么区别?
cudaDeviceScheduleYield
as written:http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group__CUDART__DEVICE_g18074e885b4d89f5a0fe1beab589e0c8.html“在等待来自设备的结果时指示CUDA to yield its thread . 在等待设备时可以 increase latency ,但可以 increase the performance 的CPU线程与设备并行执行工作 . " - i.e. wait result without burn CPU in spin - i.e. "阻止” . 和cudaDeviceScheduleBlockingSync一样 - 等待结果没有刻录CPU旋转 . 但有什么区别?
1 回答
根据我的理解,这两种方法都使用轮询进行同步 . 在
CudaDeviceScheduleSpin
的伪代码中:而
CudaDeviceScheduleYield
:即
CudaDeviceScheduleYield
告诉操作系统它可以中断轮询线程并激活另一个执行其他工作的线程 . 这会增加CPU上其他线程的性能,但也会增加延迟,以防CUDA作业完成时,当轮询之间的另一个线程在该时刻处于活动状态时 .