我正在使用c ++在Mac上编写OpenCL应用程序,在某些情况下,它会因工作量而崩溃。由于SIGABRT,程序崩溃。堆栈跟踪如下:
* frame #0: 0x00007fff6bde949a libsystem_kernel.dylib`__pthread_kill + 10
frame #1: 0x000000010050b207 libsystem_pthread.dylib`pthread_kill + 384
frame #2: 0x00007fff6bd71a1c libsystem_c.dylib`abort + 120
frame #3: 0x00007fff552290a6 libGPUSupportMercury.dylib`gpusGenerateCrashLog.cold.1 + 94
frame #4: 0x00007fff552201e7 libGPUSupportMercury.dylib`gpusGenerateCrashLog + 89
frame #5: 0x00007fff2b8683bb AppleIntelBDWGraphicsGLDriver`gpusKillClientExt + 9
frame #6: 0x00007fff55220b8f libGPUSupportMercury.dylib`gpusQueueSubmitDataBuffers + 159
frame #7: 0x00007fff2b4fbec8 AppleIntelBDWGraphicsGLDriver`IntelCLCommandBuffer::getNew(GLDQueueRec*) + 30
frame #8: 0x00007fff2b4fbdcb AppleIntelBDWGraphicsGLDriver`intelSubmitCLCommands(GLDQueueRec*, unsigned int) + 69
frame #9: 0x00007fff2b4fbd18 AppleIntelBDWGraphicsGLDriver`CHAL_INTEL::ChalContext::ChalFlush() + 82
frame #10: 0x00007fff2b4fbc85 AppleIntelBDWGraphicsGLDriver`gldFinishQueue + 43
frame #11: 0x00007fff3da205e2 OpenCL`___lldb_unnamed_symbol319$$OpenCL + 46
frame #12: 0x00007fff3da36d5f OpenCL`___lldb_unnamed_symbol677$$OpenCL + 25
frame #13: 0x000000010047c78f libdispatch.dylib`_dispatch_client_callout + 8
frame #14: 0x000000010048d9eb libdispatch.dylib`_dispatch_sync_invoke_and_complete_recurse + 131
frame #15: 0x000000010048d0e8 libdispatch.dylib`_dispatch_sync_f_slow + 322
frame #16: 0x00007fff3da0fb65 OpenCL`clFinish + 80
frame #17: 0x0000000100010298 tutorial01_first_window`cl::CommandQueue::finish() const + 24
frame #18: 0x000000010000f7dd tutorial01_first_window`cl_renderer::setMVP(glm::tmat4x4<float, (glm::precision)0>, glm::tmat4x4<float, (glm::precision)0>, glm::tmat4x4<float, (glm::precision)0>) + 317
frame #19: 0x0000000100031483 tutorial01_first_window`main + 5315
frame #20: 0x00007fff6bc9a2e5 libdyld.dylib`start + 1
有没有办法获取有关该错误的更多信息?为什么要提出SIGABRT?我可以抓住它吗?
看来您的内核在GPU本身上崩溃了。您真的无法直接获得有关此的任何其他诊断,至少在macOS上没有。您需要开始缩小问题的范围。一些建议:
clFinish()
中发生,所以您不知道是哪个异步命令导致了崩溃。尝试将所有入队呼叫切换为阻止模式。这应该导致它在实际出错的呼叫中崩溃。没有看到任何代码,我不能给您更多具体的建议。
注意,OpenCL在macOS上已被弃用,因此,如果您专门针对该平台并且不需要支持Linux,Windows等。我建议改为学习Metal Compute。苹果已经明确表示这是他们想要支持的GPU编程平台,并且它的工具已经比他们的OpenCL工具要好得多。
我怀疑Apple最终会在发布带有新型GPU的Mac时停止对OpenCL的支持,因此,即使您同时针对Mac和其他平台,也可能需要在Mac上的某处切换到Metal不管怎么说从macOS 10.14开始,该操作系统的最低系统要求已经包括支持Metal的GPU,因此,如果您希望支持所有能够运行10.13或更高版本的Mac型号,则仅需要OpenCL作为后备。