这个问题与使用cuda streams运行多个内核有关
在CUDA中,有许多同步命令cudaStreamSynchronize、CudaDeviceSynchronize、cudaThreadSynchronize和cudaStreamQuery来检查流是否为空。
在使用分析器时,我注意到这些同步命令会给程序带来很大的延迟。我想知道,除了使用尽可能少的同步命令之外,是否有人知道任何减少这种延迟的方法。
此外,是否有任何数字来判断最有效的同步方法。也就是说,假设一个应用程序中使用了3个cudaDeviceSync,其中两个需要完成才能启动第四个streams,我应该使用2个streams还是只使用一个streams,哪个损失会更小?
发布于 2012-08-15 09:26:57
同步方法之间的主要区别是“轮询”和“阻塞”。
“轮询”是驱动程序等待GPU的默认机制-它等待32位内存位置以获得GPU写入的特定值。在等待被解决后,它可能会更快地返回等待,但在等待期间,它会消耗CPU核心来查看该内存位置。
可以通过cudaDeviceScheduleBlockingSync调用cudaSetDeviceFlags()或者cudaEventBlockingSync调用cudaEventCreate()来请求封堵。阻塞等待使驱动程序将一个命令插入DMA命令缓冲区,该命令在缓冲区中的所有先前命令均已执行时发出中断信号。然后,驱动程序可以将中断映射到Windows事件或Linux文件句柄,从而使同步命令能够等待,而不会像默认轮询方法那样不断消耗CPU。
查询基本上是对用于轮询等待的32位内存位置的手动检查;因此在大多数情况下,它们非常便宜。但是如果启用了ECC,则查询将进入内核模式以检查是否存在任何ECC错误;在Windows上,任何挂起的命令都将刷新到驱动程序(这需要一个内核thunk)。
https://stackoverflow.com/questions/11953722
复制相似问题