7
__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内核调用后不需要?为什么我们需要cudaDeviceSynchronize();在device-printf的内核中?
但如果你看到我发布的链接,在kernal调用之后立即调用cudamemcpy(.... device to host)。为什么我们在这里没有cudadevicesynchronize()? – gpuguy
因为发给同一个流的CUDA操作(API调用,内核调用),即使是异步的,也保证串行执行。因此,由于内核和cudaMecpy操作位于同一个(默认)流中,因此即使内核启动是异步的(相对于主机线程),cudaMemcpy也会保证在内核完成之前不会开始。 –