Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
__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(); 在很多地方,例如这里 在内核调用后不需要?
内核启动是异步的。这意味着它在启动 GPU 进程后,在内核完成执行之前立即将控制权返回给 CPU 线程。
那么这里的 CPU 线程中的下一件事是什么?应用程序退出。
在应用程序退出时,将输出发送到标准输出的能力被操作系统终止。
因此,内核稍后生成的输出无处可去,您将看不到它。
另一方面,如果您使用,那么在允许应用程序退出之前cudaDeviceSynchronize(),保证内核完成(并且内核的输出将找到一个等待的标准输出队列) 。
cudaDeviceSynchronize()