1

さて、私はAppleデベロッパフォーラムで質問しようとしましたが、誰も応答しませんでした。スタックオーバーフローの方が適切だと思いました。ここにあります...

フレームバッファオブジェクトに格納されているピクセルを実行し、非黒と非白のピクセルをカウントするOpenCLカーネルがいくつかあります。以前は私のマシンで正常に動作していましたが、Mac OS Xやdevtoolsを更新すると、問題が発生してストールが発生した可能性があります。

カーネルコードに関連付けられたカーネルオブジェクトはQTウィンドウにアタッチされ、ウィンドウでレンダリングの更新が必要な場合、カーネルコードはn回実行されます。このウィンドウは、最初に作成された後に2回更新されます。つまり、openCLコードのシーケンスによって最初に問題が発生することはありません。ウィンドウを前面に表示すると、別の更新が必要になり、カーネルコードをさらにn回実行しようとします。しかし、それらのn回の途中で、それは失速します。つまり、51回実行する必要がある場合、反復26で停止します。clEnqueueReadBufferを呼び出すと停止するようです。

どうしても必要な場合を除いて、openCLコードを使用する理由については、混乱を招く可能性があるため、詳細は省略します。OpenCLコード自体に焦点を当てたほうがいいと思いました。ここに参照用です:http://dl.dropbox.com/u/10838242/forumsquestion.cpp

gdbのバックトレースは次のとおりです。

#0  0x00007fff8e3a6122 in __psynch_mutexwait ()
#1  0x00007fff8955ad9d in pthread_mutex_lock ()
#2  0x000000010dd3acbd in gldFlushQueue ()
#3  0x000000010bbc193f in IOAccelContextFinishResourceSysMem ()    
#4  0x000000010bbcd5b0 in gpumAcquireFenceOnQueue ()
#5  0x000000010dd43fcd in gldCopyBufferDataWithQueue ()
#6  0x00007fff8ffa7e2e in GCC_except_table49 ()
#7  0x00007fff8ffc5f11 in clFinish ()
#8  0x00007fff936800b6 in _dispatch_client_callout ()
#9  0x00007fff93681723 in _dispatch_barrier_sync_f_invoke ()
#10 0x00007fff8ffc5ddb in clFinish ()
#11 0x00007fff8ffc25c2 in clSetEventCallback ()
#12 0x00007fff8ffb86e6 in clEnqueueReadBuffer ()
#13 0x0000000100020a31 in CLHandler::update (this=0x107683e20, tagged=@0x7fff5fbfb960, w=761, h=711) at clhandler.cpp:343
#14 0x000000010002f8c1 in CustomBladesGLWidget::render (this=0x1072b09e0, indexMode=true, offset=135288, numPnts=4416, blobID=25, bladeIdsIntersected=@0x7fff5fbfb960) at customBladesGLWidget.cpp:943

添付ファイルの343行目(上記の太字)は、この呼び出し(関数CLHandler :: update内)に対応しています。

//read data from buffer
status = clEnqueueReadBuffer(cqueue,hitbuffer,CL_TRUE,0,mNumBladeCells * sizeof(float),mBladesHit,0, NULL,&event);
handleError("clEnqueueReadBuffer","",status);

ここで、clEnqueueWriteBufferの最初の呼び出しより下のすべてにコメントを付けると、代わりにその関数呼び出しで停止します。なぜこれが起こるのか分かりません。ミューテックスなどを使おうとしているわけではありません。どんな助けでも大歓迎です。

システム仕様:MacbookPro 8,2、Core i7 2.2 GHz、AMD Radeon HD 6750M、OSX10.8.2。

ありがとう

4

2 に答える 2

1

glFinishGLオブジェクトを使用した最初のOpenCLAPI呼び出しの前とclFinish、最後の呼び出しの後にを呼び出す必要があります。より弱いオプション(つまり、Finishの代わりにFlushを呼び出す)は、特定のプラットフォームで機能する場合があります。

OpenCL1.2拡張仕様のセクション9.7.6.1を参照してください。

アップデート。 特にAppleプラットフォームでは、最速のオプションはglFlushRenderApple、最初のOpenCL呼び出しの前、およびclFinish最後の呼び出しの後に呼び出すことです。

于 2013-01-05T02:46:03.090 に答える
0

書き込みをブロックしている(3番目のパラメーターがtrue)と述べている場合、なぜイベントをclEnqueueWriteBuffer / clEnqueueReadBufferに渡すのですか?このため、clWaitForEvents(1、&event)を呼び出す必要もありません。

代わりに、clEnqueueNDRangeKernelにイベントを追加します。clFlush()の後でそれを待ちます。clFlushは実行をトリガーするだけであり、呼び出し後に以前にキューに入れられたすべてのコマンドが終了するという保証はありません(clFinishとは異なります)。そして、clEnqueueReleaseGLObjectsを呼び出します。ただし、 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLEフラグ を使用してキューが作成されなくなったらすぐに、ケースも問題ないはずです。

また、コメント/コメント解除される正確な行を指定できますか?

于 2013-01-04T22:52:41.053 に答える