为什么我们需要cudaDeviceSynchronize();在内核中使用device-printf?

时间:2013-10-05 02:52:16

标签: c cuda gpu nvidia

__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,在内核调用后不需要它?

1 个答案:

答案 0 :(得分:16)

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

那么CPU线程的下一步是什么呢?申请退出。

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

因此,内核稍后生成的输出无处可去,您将看不到它。

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