2013-10-05 3 views

答えて

14

カーネルの起動は、です。非同期です。つまり、カーネルの実行が終了する前に、GPUプロセスを起動した直後にCPUスレッドに制御を戻します。

ここでCPUスレッドの次のことは何ですか?アプリケーション終了。

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

したがって、カーネルによって後で生成される出力はどこにもありません。表示されません。

あなたがcudaDeviceSynchronize()を使用している場合、そのカーネルを終了することが保証される(およびカーネルからの出力が待っている標準出力キューがあります)一方、前にアプリケーションを終了するには許可されています。

+0

私が投稿したリンクが表示された場合は、kernalコールの直後にcudamemcpy(.... device to host)を呼び出しています。なぜここにcudadevicesynchronize()がないのですか? – gpuguy

+5

同じストリームに発行されたCUDA操作(API呼び出し、カーネル呼び出し)は、たとえ非同期であっても連続して実行されることが保証されているためです。したがって、カーネルとcudaMecpy操作は同じ(デフォルトの)ストリームになっているので、cudaMemcpyは、カーネルの起動が非同期(ホストスレッドに関して)であっても、カーネルが完了するまで開始されないことが保証されます。 –

関連する問題