提问者:小点点

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


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


共1个答案

匿名用户

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

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

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

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

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