何时真正需要调用cudaDeviceSynchronize
函数?
据我从CUDA文档中了解,CUDA内核是异步的,因此似乎我们应该在每次内核启动后调用cudaDeviceSynchronize
。但是,我尝试了相同的代码(训练神经网络),有无cudaDeviceSynchronize
,但时间测量之前没有。我发现我得到了相同的结果,但是速度提高了7-12倍(取决于矩阵大小)。
因此,问题是除了时间测量之外,是否有任何理由使用cudaDeviceSynchronize
。
例如:
cudaMemcpy
将数据从GPU复制回主机之前是否需要? C = A * B
D = C * F
我应该在两者之间放置
cudaDeviceSynchronize
吗?从我的实验看来,我没有。
为什么
cudaDeviceSynchronize
会使程序这么慢? 最佳答案
尽管CUDA内核启动是异步的,但放置在一个流中的所有与GPU相关的任务(这是默认行为)是顺序执行的。
因此,例如
kernel1<<<X,Y>>>(...); // kernel start execution, CPU continues to next statement
kernel2<<<X,Y>>>(...); // kernel is placed in queue and will start after kernel1 finishes, CPU continues to next statement
cudaMemcpy(...); // CPU blocks until memory is copied, memory copy starts only after kernel2 finishes
因此,在您的示例中,不需要
cudaDeviceSynchronize
。但是,对于调试以检测哪个内核导致了错误(如果有)是有用的。cudaDeviceSynchronize
可能会导致速度变慢,但是7-12倍似乎太多了。时间测量可能存在一些问题,或者内核确实非常快,并且显式同步的开销相对于实际计算时间而言是巨大的。