10
__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(); たとえばここの多くの場所 では、カーネル呼び出しの後は必要ありませんか?

4

1 に答える 1

20

カーネルの起動は非同期です。これは、カーネルが実行を完了する前に、GPU プロセスを開始した直後に CPU スレッドに制御を戻すことを意味します。

では、ここの CPU スレッドの次は何でしょう? アプリケーション出口。

アプリケーションの終了時に、出力を標準出力に送信する機能は OS によって終了されます。

したがって、後でカーネルによって生成される出力には行き場がなく、表示されません。

一方、 を使用すると、アプリケーションの終了が許可される前にcudaDeviceSynchronize()、カーネルが終了することが保証されます (カーネルからの出力は、待機中の標準出力キューを見つけます) 。

于 2013-10-05T03:06:27.783 に答える