【问题标题】:why do we need cudaDeviceSynchronize(); in kernels with device-printf?为什么我们需要 cudaDeviceSynchronize();在带有 device-printf 的内核中?
【发布时间】:2013-10-12 04:11:35
【问题描述】:
__global__ void helloCUDA(float f)
{
    printf("Hello thread %d, f=%f\n", threadIdx.x, f);
}

int main()
{
    helloCUDA<<<1, 5>>>(1.2345f);
    cudaDeviceSynchronize();
    return 0;
}

为什么是 cudaDeviceSynchronize();在很多地方,例如here 内核调用后不需要?

【问题讨论】:

    标签: c cuda gpu nvidia


    【解决方案1】:

    内核启动是异步的。这意味着它在启动 GPU 进程后,在内核完成执行之前立即将控制权返回给 CPU 线程。

    那么 CPU 线程的下一步是什么?应用程序退出。

    在应用程序退出时,将输出发送到标准输出的能力被操作系统终止。

    因此内核后面生成的输出无处可去,你也看不到。

    另一方面,如果你使用cudaDeviceSynchronize(),那么内核保证完成(并且内核的输出会找到一个等待的标准输出队列),之前应用程序被允许退出。

    【讨论】:

    • 但是如果您看到我发布的链接,在内核调用之后我们立即调用 cudamemcpy(....设备到主机)。为什么我们这里没有 cudadevicesynchronize()?
    • 因为发给同一流的 CUDA 操作(API 调用、内核调用)即使是异步的,也可以保证串行执行。因此,由于内核和 cudaMecpy 操作在同一个(默认)流中,因此 cudaMemcpy 保证在内核完成之前不会开始,即使内核启动是异步的(相对于主机线程而言)。
    • 所以如果没有 cudaMemcpy 程序会终止??
    猜你喜欢
    • 2021-12-22
    • 2018-02-07
    • 2019-06-09
    • 2023-04-09
    • 2012-03-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多