gpt4 book ai didi

c++ - 尝试运行内核代码时 OpenCL(意外)卡住

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:54 25 4
gpt4 key购买 nike

好吧,我试过在 Apple 开发者论坛上提问,但没有人回应。我认为stackoverflow会更合适。这是...

我有一些 OpenCL 内核,它遍历存储在帧缓冲区对象中的像素,并对非黑色和非白色像素进行计数。它过去在我的机器上运行良好,但我相信 Mac OS X 和/或 devtools 的更新可能会导致问题导致它停止。

与内核代码关联的内核对象附加到QT窗口,当窗口需要渲染更新时,内核代码运行n次。此窗口在初始创建后会更新两次,这意味着 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、OS X 10.8.2。

谢谢

最佳答案

在第一次使用 GL 对象的 OpenCL API 调用之前应该调用 glFinish,在最后一个调用之后调用 clFinish。较弱的选项(即调用 Flush 而不是 Finish)可能适用于特定平台。

参见 OpenCL 1.2 extension specification , 第 9.7.6.1 节。

更新。特别是在 Apple 平台上,最快的选择是在第一次 OpenCL 调用之前调用 glFlushRenderApple,在最后一次调用之后调用 clFinish一个。

关于c++ - 尝试运行内核代码时 OpenCL(意外)卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14151988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com