这个问题关系到使用CUDA流运行多个内核
在CUDA有许多同步命令cudaStreamSynchronize,CudaDeviceSynchronize,的cudaThreadSynchronize,也对的cudaStreamQuery检查,如果流是空的。
我使用这些命令的同步引入大延迟到程序探查时发现。 我想知道如果任何人知道任何方式除了当然的使用尽可能少的同步命令尽可能减少这种延迟。
也没有任何数据来判断最effecient同步方法。 这是考虑在应用程序中使用的3个数据流,其中两个需要完成,我发动我应该使用2个cudaStreamSyncs第四流或只是一个cudaDeviceSync什么都会招致损失少?
同步方法之间的主要区别是“轮询”和“阻挡”。
“轮询”是默认机构的驱动程序等待GPU - 它等待一个32位存储器位置达到由GPU写入某一值。 它可以更快速地等待被解决后返回等待,而是在等待,它燃烧CPU内核看着那个内存位置。
“阻塞”可以通过调用请求cudaSetDeviceFlags()
与cudaDeviceScheduleBlockingSync
,或调用cudaEventCreate()
与cudaEventBlockingSync
。 阻塞等待导致驾驶员插入一个命令时到缓冲区中的所有前面的命令已被执行的信号中断的DMA命令缓冲区。 然后,驾驶员可以映射中断Windows事件或Linux的文件句柄,使同步命令来等待不烧不断的CPU一样,默认的轮询方法。
查询是基本上用于轮询等待32位存储器位置的手动检查; 所以在大多数情况下,他们都非常便宜。 但是,如果启用了ECC,查询将深入到内核模式,以检查是否有任何ECC错误; 而在Windows上,任何未决的命令将被刷新到驱动程序(这需要一个内核的thunk)。