2012-09-28 7 views
10

ホストは、デバイスが完全に実行を完了するのを待ちますか?例: プログラムは次のような構造を持っています。CPUはDEVICEがカーネル実行を終了するのを待ちますか?

// cpu code segment 

// data transfer from host to device 

QUESTION - WILL CPU WAIT FOR DEVICE TO FINISH TRANSFER? IF NO, IS IT POSSIBLE? IF YES, HOW? 

// kernel launch 

QUESTION - WILL CPU WAIT FOR DEVICE TO LET IT FINISH KERNEL EXECUTION (CONSIDERING KERNEL EXECUTION WILL TAKE NOTABLE TIME say-5 sec)? IF NO, IS IT POSSIBLE? IF YES, HOW? 

// data transfer from device to host 

// program terminates after printing some information 
+0

@Spontifixus、それは明らかですか?私はOPと同じように思っています。 –

+1

@Primož'c0dehunter'Kraljあなたは正しいです。質問はちょうどひどくフォーマットされています。 – Spontifixus

答えて

14

CUDA実行時の同期機能は、あなたが望むものを達成できるようにします。

cudaDeviceSynchronize():あなたはこの関数を呼び出すと、デバイスは、それがメモリコピーまたはカーネル実行であるかどうか、そのすべての作業を完了するまで

、CPUが待機します。

cudaStreamSynchronize(cudaStream):指定されたCUDAストリームがその実行を完了するまで

この機能は、CPUをブロックします。他のCUDAストリームは非同期的に実行を継続します。

+6

これを拡張するには2つの質問があります:1)データ転送のためにCPUがブロックし、 'cudaMemcpy()'を使うと転送が完了するのを待ちます - 非同期バージョン( 'cudaMemcpyAsync()')非同期であり、CPUはブロックしません(明らかに)。 2)カーネルの起動は、プログラミングガイドに記載されているように常に非同期です - カーネルコール( 'cudaDeviceSynchronize()'(または同等のストリームを使用)を使用するか同期memcpyを呼び出すと同期してCPUがブロックされます) – Tom

+1

また、 GPUを使用すると理想的にはデータをコピーして非同期にカーネルを実行することができます。すべてのエンジンを自由に使いこなすことができます。 – Tom