2

私は基本的に次のようなコードを持っています:

for (...) {
     clEnqueueNDRangeKernel(...)
     clFinish(...)
     clEnqueueTask(...)
     clEnqueueReadBuffer(...) // blocking
}

すべてが単一のコマンドキューにあり、アウトオブオーダー実行モードが有効になっていません。

このコードは、GPUハードウェアで約7.5秒で実行されます。clFinish呼び出しを削除すると、12秒で実行されます。キューの実行を開始するにはclFlushを呼び出す必要があると読みましたが、clFinishをclFlushに置き換えると、12秒で実行されます。

私が正しく理解していれば、clFinishは、すべてのコマンドが終了するのを待つブロッキング呼び出しです。clFlushの代わりにそれを使用すると、コードの実行が速くなりますか?

4

1 に答える 1

0

clFinish を呼び出すと、コードが GPU で追加の作業項目をスケジュールできなくなります。GPU が処理できる以上の作業項目をスケジュールすると、パフォーマンスが低下します。コードがなければなんとも言えませんが、それはあなたの問題のように思えます。

于 2014-01-16T19:08:09.147 に答える