__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;
}
Warum ist cudaDeviceSynchronize(); an vielen Orten zum Beispiel here ist es nach Kernel-Aufruf nicht erforderlich?Warum brauchen wir cudaDeviceSynchronize(); in Kernen mit Device-Printf?
aber wenn Sie den Link sehen, den ich gepostet habe, rufen wir sofort nach Kernal Call cudamemcpy (.... Gerät zu Host). Warum haben wir hier keine cushadevicesynchronize()? – gpuguy
Da CUDA-Operationen (API-Aufrufe, Kernel-Aufrufe), die für denselben Stream ausgegeben werden, selbst wenn sie asynchron sind, werden sie garantiert seriell ausgeführt. Da sich der Kernel und die cudaMecpy-Operation im selben (Standard) -Stream befinden, wird der cudaMemcpy garantiert nicht so lange gestartet, bis der Kernel abgeschlossen ist, obwohl der Kernel-Start asynchron ist (in Bezug auf den Host-Thread). –