10
__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(); 在很多地方,例如这里 在内核调用后不需要?

4

1 回答 1

20

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

那么这里的 CPU 线程中的下一件事是什么?应用程序退出。

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

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

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

于 2013-10-05T03:06:27.783 回答