2012-05-07 5 views
0

私は大きな配列でカーネルを実行しています。 clEnqueueNDRangeコマンドをプロファイルすると、実行時間(end-start)は.001 msですが、送信と開始(start-submit)の間の時間は入力データのサイズによって異なります。コマンドの実行が開始されるまで、コマンドが実行されるとどうなりますか。この大きな時間を得ることは合理的ですか?OpenCLでのコマンドの送信から開始までの時間が長い

+0

clEnqueueNDRangeコールの後にカーネルの結果が必要なものがありますか?たとえば、カーネルの後ろにclEnqueueMapBufferがブロックされていますか?そうでない場合、実装はカーネルの実行を遅らせることを決定しているかもしれない。 – boiler96

+0

はい私は結果を読み取るために2つのclEnqueueReadBufferを持っていますが、非ブロッキング呼び出しで結果を読み取ることができません。また、clEnqueueMapBufferには私に間違った結果をもたらすいくつかの問題があるようです。とにかく非ブロッキングコールでデータを読み取ることは可能ですか? – Damoon

答えて

0

OpenCLは非同期で動作します。つまり、作業を行うように求めるときは、その時点では発生しない可能性があります。それは将来のある時に起こります。これはちょっと変だけど、特にプロファイリングを始めるときにはそうですが、CPUがOpenGLデバイスのためにたくさんの作業をキューに入れることができるように動作します。例えば

ここ
clEnqueueWriteBuffer(blah); 
clEnqueueNDRange(blah); 
clEnqueueReadBuffer(blah, but blocking_read = CL_TRUE); 

、ライトバッファおよびNDRangeは、おそらく時間の非常に少量を取るように見えます。彼らがすることは、何をする必要があるのか​​を記録することだけです。ブロックされたreadBufferは、読み込みの結果を待たなければならないため、長い時間がかかります。読み込みが完了する前に、読み込みが開始される前に、書き込みとカーネルの実行が完了している必要があります。

読み込みは非常に小さいかもしれませんが、読み込みが完了する前にすべてを待っているため、取り込まれるように見えるのはその前のコマンドの作業量に依存します。

私はあなたの質問からあなたが何を測定しているのかよく分かりませんが、あなたが見ているのはこの効果です。以前の仕事が終わるのを待たなければならないので、仕事のための時間は他の機能に課されています。

高性能コードの作成に関して、どの機能がCPUをGPUで待機させるかを知ることは、大きなトリックの1つです。このような待ち時間を導入すると、CPUは何らかの有用な作業をやめ、CPUが次の作業を準備している間にGPUがアイドルになる可能性が高くなります。時には、代替手段がなく、あなたはただ待たなければなりません。

関連する問題