在cuda编程指南中,提到以下操作将导致隐式同步:
页锁定主机内存分配
我想知道这是否包括cudaHostRegister
和cudaHostUnregister
?如果没有那么这意味着我们可以在所有异步操作之前调用malloc
,然后在异步部分中我们可以cudaHostRegister
。这是对的吗?
任何CUDA命令到默认流
这是否包括使用cudaEvent的任何操作,例如在流0上记录事件或让流0在其他流中等待某些事件?
顺便说一下,隐式同步是在一个设备中发生还是同步在所有设备上?
答案 0 :(得分:1)
我想知道这是否包括cudaHostRegister和 cudaHostUnregister?
是的,我相信这些功能存在隐式同步。但正如我在上面的评论中所说,这些都是缓慢的功能。如果可以,请使用cudaHostAlloc()代替。如果您正在使用共享内存或类似需要cudaHostRegister()的内存,那么您通常只需要在程序开头附近处理一次,然后将其注册。
这是否包括使用cudaEvent的任何操作,例如录制 流0上的事件或让流0等待其他流中的某些事件?
同样,这是默认流中的CUDA调用,所以我相信隐式同步也在这里完成。
顺便说一句,隐式同步是否在一个设备中发生 或同步是否将通过所有设备?
同步仅适用于同一设备。它不会影响其他设备。
请注意,您现在可以使用cudaStreamCreateWithFlags创建一个不与默认流隐式同步的流:
cudaStreamCreateWithFlags( &stream, cudaStreamNonBlocking );
如果您的主机代码在多个主机线程的同一GPU上运行CUDA内核,那么还有一些其他方法可能会有用。 CUDA 7.0 RC有一个新的nvcc选项, - default-stream = per-thread,你可能想要查看它。使用此选项,默认情况下每个主机线程都使用自己的流。
但是,如果您正在尝试优化并检查隐式同步,那么我首先要使用CUDA探查器,nvvp或作为NSight Eclipse Edition一部分的探查器。