__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,在内核调用后不需要它?
答案 0 :(得分:16)
内核启动是异步。这意味着它在内核完成执行之前,在启动GPU进程后立即将控制权返回给CPU线程。
那么CPU线程的下一步是什么呢?申请退出。
在应用程序退出时,操作系统终止向标准输出发送输出的能力。
因此,内核稍后生成的输出无处可去,您将看不到它。
另一方面,如果你使用cudaDeviceSynchronize()
,那么内核保证完成(并且内核的输出将找到一个等待的标准输出队列),之前应用程序被允许退出。