[调用finish()时OpenCL崩溃

问题描述 投票:1回答:1

我正在使用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?我可以抓住它吗?

macos opencl sigabrt
1个回答
0
投票

看来您的内核在GPU本身上崩溃了。您真的无法直接获得有关此的任何其他诊断,至少在macOS上没有。您需要开始缩小问题的范围。一些建议:

  • 由于崩溃目前正在clFinish()中发生,所以您不知道是哪个异步命令导致了崩溃。尝试将所有入队呼叫切换为阻止模式。这应该导致它在实际出错的呼叫中崩溃。
  • 检查全部 OpenCL API调用上的返回/错误代码。有时,忽略先前调用中的错误可能会导致依赖先前结果的后续调用出现问题。例如,如果创建缓冲区失败,则将该缓冲区创建的结果作为内核参数传递将在尝试运行内核时引起问题。
  • 最可能导致崩溃的原因是您的OpenCL内核正在超出范围访问内存,否则将滥用指针。重新检查所有数组索引计算。
  • 检查较小的工作批次是否出现问题。从一个工作组(或工作项,如果不使用组)进行扩展,看看它是否仅出现在一定的工作规模之外。这可能会为您提供有关可能导致崩溃的缓冲区大小和数组索引的线索。
  • 系统地注释掉内核的一部分。如果您注释掉一段特定的代码后崩溃消失了,那么问题很可能出在该代码中。
  • 如果您将问题缩小到一小段代码,但无法确定问题的根源,请开始记录诊断输出,以检查变量是否具有所需的值。

没有看到任何代码,我不能给您更多具体的建议。

注意,OpenCL在macOS上已被弃用,因此,如果您专门针对该平台并且不需要支持Linux,Windows等。我建议改为学习Metal Compute。苹果已经明确表示这是他们想要支持的GPU编程平台,并且它的工具已经比他们的OpenCL工具要好得多。

我怀疑Apple最终会在发布带有新型GPU的Mac时停止对OpenCL的支持,因此,即使您同时针对Mac和其他平台,也可能需要在Mac上的某处切换到Metal不管怎么说从macOS 10.14开始,该操作系统的最低系统要求已经包括支持Metal的GPU,因此,如果您希望支持所有能够运行10.13或更高版本的Mac型号,则仅需要OpenCL作为后备。

© www.soinside.com 2019 - 2024. All rights reserved.