CUDA中的同步

mil*_*d_b 2 cuda

我在cuda中阅读了关于同步的cuda参考手册,但我不清楚.例如,为什么我们使用cudaDeviceSynchronize()__syncthreads()?如果不使用它们会发生什么,程序无法正常工作?行动cudaMemcpycudaMemcpyAsync行动有什么区别?
你能展示一个展示这种差异的例子吗?

Rob*_*lla 10

cudaDeviceSychronize()当需要CPU活动等待任何挂起的GPU活动完成时,在主机代码中使用(即在CPU上运行).在许多情况下,没有必要明确地执行此操作,因为发布到单个流的GPU操作会自动序列化,而某些其他操作(如cudaMemcpy()内置的固有阻塞设备同步)也是如此.但是出于某些其他目的,例如调试代码,强制设备完成任何未完成的活动可能会很方便.

__syncthreads()用于设备代码(即在GPU上运行),并且在具有独立并行操作的代码中可能根本不需要(例如,逐个元素地将两个向量相加).然而,通常使用的一个示例是将在共享存储器之外操作的算法.在这些情况下,经常需要将值从全局内存加载到共享内存中,并且我们希望线程块中的每个线程都有机会在任何实际处理发生之前加载其适当的共享内存位置.在这种情况下,我们希望__syncthreads()在处理发生之前使用,以确保完全填充共享内存.这只是一个例子. __syncthreads()可以在任何时候在线程块内同步时使用.它不允许块之间的同步.

cudaMemcpy和之间的区别在于,cudaMemcpyAsync非同步版本的调用只能发送到流0,并将阻止调用CPU线程,直到副本完成.异步版本可以选择接受stream参数,并在复制完成之前立即将控制权返回给调用线程.异步版本通常在我们希望进行异步并发执行的情况下使用.

如果您对CUDA编程有基本问题,建议您参加一些网络研讨会.