cudaDeviceScheduleBlockingSync和cudaDeviceScheduleYield有什么区别?

3
如此说来:如何减少CUDA同步延迟 等待设备结果有两种方法:
  • "轮询" - 通过自旋消耗CPU资源以减少等待结果的延迟
  • "阻塞" - 线程在等待中断期间处于休眠状态,以提高总体性能
对于"轮询",需要使用CudaDeviceScheduleSpin
但是对于"阻塞",我需要使用CudaDeviceScheduleYield还是cudaDeviceScheduleBlockingSynccudaDeviceScheduleBlockingSynccudaDeviceScheduleYield有什么区别?
正如所写的cudaDeviceScheduleYield会在等待设备结果时指示CUDA让线程停止。这可能会增加等待时间,但可以同时提高CPU线程执行并行工作的性能。即等待结果而不自旋消耗CPU资源,就是"阻塞"。而cudaDeviceScheduleBlockingSync也是等待结果,不过不自旋消耗CPU资源。但有什么区别呢?

我不明白你在问什么区别 - 两者之间的区别正是你引用的内容。一个使用中断,另一个使用轮询循环。 - talonmies
@talonmies,即CudaDeviceScheduleYieldCudaDeviceScheduleSpin是否都使用轮询循环?那么它们之间有什么区别?根据文档,CudaDeviceScheduleYield增加延迟,因此它不能是“轮询”,不是吗? - Alex
1个回答

7

据我理解,这两种方法都使用轮询来同步。对于CudaDeviceScheduleSpin的伪代码:

while (!IsCudaJobDone())
{
}

相比之下,CudaDeviceScheduleYield

while (!IsCudaJobDone())
{
     Thread.Yield();
}

CudaDeviceScheduleYield告诉操作系统它可以中断轮询线程并激活另一个正在做其他工作的线程。这会提高CPU上其他线程的性能,但也会增加延迟,因为如果CUDA作业在轮询线程以外的其他线程处于活动状态时完成,则会增加延迟。


2
谢谢!按照延迟从低到高的顺序,分别是:CudaDeviceScheduleSpinCudaDeviceScheduleYieldcudaDeviceScheduleBlockingSync - Alex
1
是的,还有一个按“其他任务的CPU使用率”从低到高排序的命令。但是如果轮询线程在CUDA任务完成时是当前CPU上的线程,则cudaDeviceScheduleSpin和cudaDeviceScheduleYield应具有相同的延迟时间。 - kunzmi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接