Cuda 关于隐式同步的几个问题?

Cuda 关于隐式同步的几个问题?,cuda,Cuda,《cuda编程指南》中提到,以下操作将导致隐式同步: 页锁定主机内存分配 我想知道这是否包括cudaHostRegister和cudaHostUnregister?如果不是,那么这意味着我们可以在所有异步操作之前调用malloc,然后在异步部分中,我们可以执行cudahosterregister。是这样吗 将任何CUDA命令添加到默认流 这是否包括任何与cudaEvent相关的操作,例如记录流0上的事件或让流0等待其他流中的某些事件 顺便问一下,隐式同步是发生在一个设备内还是发生在所有设备上 我

《cuda编程指南》中提到,以下操作将导致隐式同步:

页锁定主机内存分配


我想知道这是否包括
cudaHostRegister
cudaHostUnregister
?如果不是,那么这意味着我们可以在所有异步操作之前调用
malloc
,然后在异步部分中,我们可以执行
cudahosterregister
。是这样吗

将任何CUDA命令添加到默认流

这是否包括任何与cudaEvent相关的操作,例如记录流0上的事件或让流0等待其他流中的某些事件

顺便问一下,隐式同步是发生在一个设备内还是发生在所有设备上

我想知道这是否包括Cudahostergister和 cudaHostUnregister

是的,我相信这些函数是隐式同步的。但正如我在上面的评论中所说,这些都是缓慢的函数。如果可以,请改用cudaHostAlloc()。如果您使用的是共享内存或类似的需要cudahosteregister()的东西,您通常希望在程序开始时只处理一次,然后保持注册状态

这是否包括任何与cudaEvent相关的操作,例如录制 流0上的事件还是让流0等待其他流中的某些事件

同样,这是默认流中的CUDA调用,因此我相信隐式同步也在这里完成

顺便问一下,隐式同步是否发生在一个设备内 或者同步将覆盖所有设备

同步仅适用于同一设备。它不会影响其他设备

请注意,您现在可以使用以下方法创建一个不与默认流隐式同步的流:

如果您的主机代码从多个主机线程在同一GPU上运行CUDA内核,那么还有一些东西可能会很有用。CUDA 7.0 RC有一个新的nvcc选项,-default stream=per thread,您可能需要查看它。使用此选项,默认情况下,每个主机线程都使用自己的流


但是,如果您试图优化和检查隐式同步,我会首先使用CUDA探查器、nvvp或NSight Eclipse Edition中的探查器。

您是在单个流还是多个流的上下文中问这个问题?它是在多个流中问的。关于CUDAHOSTERegister()和cudaHostUnregister()-它们的速度很慢。所以无论它们是否导致隐式同步(我认为它们会),它们可能不是您想要使用的,除非您需要固定预分配的内存(如共享内存),然后将其保持注册状态。@DavidSteinhauer:谢谢!这非常有用!我确实有一些东西会减慢我的程序,但我还没有弄明白。
CudahosterRegister()
的设计不允许以任何频率调用。它使用操作系统设施对指定的地址范围进行页面锁定,然后让CUDA的内核模式驱动程序映射GPU的内存。它可能是隐式同步的,页面锁定地址范围所需的时间因平台和其他情况而异(例如,页面是否已驻留)。
cudaStreamCreateWithFlags( &stream, cudaStreamNonBlocking );