2012-03-22 19 views
1

私はOpen Fl Flockingを書くと私は奇妙な問題があります。カーネル実行の前に、clEnqueueReadBufferはgpu memからプログラムmem 20000配列floatへの読み込みに非常に高速ですが、カーネルが実行した後、渡された配列上で何らかの操作を行った後、最後にreadbufferが長すぎます(〜150 ms)。どうして?どちらの場合も、配列はデータで埋められました。私のカーネルはどうしたのでしょうか? (渡された配列は__globalです)。Open CL clEnqueueReadBuffer実行時間

+0

カーネルが実行される前にgpuメモリがどのようにデータで満たされていましたか? – ardiyu07

答えて

1

clEnqueueNDRangeKernelは、実際にカーネルを起動しないので、それらを「エンキュー」します。 OpenCLの実装は、カーネルが適切に見えるときにいつでもカーネルを開始することができます(この場合、結果を知るためにカーネルを実行する必要があるので、結果を読むように頼んだとき)。

しかし、実装では強制的にカーネルを開始することができます。clFinish

実際には、カーネルが実行されるまでに150msの遅延があります。

clFinishを実行と2回目の読み込みの間に呼び出すと、動作します。