何时真正需要调用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倍似乎太多了。时间测量可能存在一些问题,或者内核确实非常快,并且显式同步的开销相对于实际计算时间而言是巨大的。

    10-07 14:09