2013-10-05 246 views

回答

14

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

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

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

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

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

+0

但如果你看到我发布的链接,在kernal调用之后立即调用cudamemcpy(.... device to host)。为什么我们在这里没有cudadevicesynchronize()? – gpuguy

+5

因为发给同一个流的CUDA操作(API调用,内核调用),即使是异步的,也保证串行执行。因此,由于内核和cudaMecpy操作位于同一个(默认)流中,因此即使内核启动是异步的(相对于主机线程),cudaMemcpy也会保证在内核完成之前不会开始。 –