7

GPU でカーネルを実行し、ホスト (CPU) で追加の計算を実行しようとしています。私はこの効果を見ます:

カーネルのみが約 2000 ミリ秒を必要とします。

clEnqueueNDRangeKernel ...

clFinish (または clWaitForEvents、両方試しました)

sleep(10) を使用して、CPU で追加の計算をシミュレートしました。

clEnqueueNDRangeKernel ...

睡眠 (10);

clFinish (または clWaitForEvents)

理論的には、カーネルは GPU で実行され、10 秒のスリープ後にカーネルは終了するはずです。しかし、時間測定では、10000 ではなく 12000 ミリ秒が必要であると述べています。

clFinish または clWaitForEvents はカーネルを呼び出して開始しますか、それとも何か見逃していましたか?

AMD Fusion CPU/GPU と Linux を使用しています。

どうもありがとう。

4

2 に答える 2

6

clFlushの直後に電話してみてくださいclEnqueueNDRangeKernel:

clフラッシュ

コマンド キューに関連付けられているデバイスに、コマンド キュー内の以前にキューに入れられたすべての OpenCL コマンドを発行します。

http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clFlush.html

于 2012-09-20T11:05:24.087 に答える
2

clFinish() は、プログラムがこの関数の前に進んだときにカーネルが終了したことのみを保証しますが、カーネルがいつ実行を開始するかは不明です。clFlush() は、プログラムが clFlush() の文を進めている間、カーネルがデバイス上で開始されたことを保証できますが、いつ終了するかは不明であるため、カーネルがデバイス上で起動されたことを確認するために clFlush() が必要です。時間 (2000ms) は、ホスト側でスリープ時間 (10000ms) と重複する可能性があります。それが役立つことを願っています。

于 2012-09-21T07:21:17.280 に答える