【问题标题】:How to get the stacktrace of OpenCL kernel compiler?如何获取 OpenCL 内核编译器的堆栈跟踪?
【发布时间】:2014-06-16 03:10:47
【问题描述】:

当我调用CL10.clBuildProgram(program, devices.get(0), "", null) 方法时,它会抛出org.lwjgl.opencl.OpenCLException: Error Code: CL_BUILD_PROGRAM_FAILURE (0xFFFFFFF5) 异常。我所知道的一切都是构建失败,但我的内核代码中的错误没有得到任何澄清。

出现此类错误后如何获取内核编译器的staktrace?

【问题讨论】:

  • 也许显示您正在编译的内核可能会有所帮助...
  • @StefanoSanfilippo 每次遇到此类问题时,我都会修复我的代码,但查找错误原因需要花费大量时间和大量精力。我想有一个共同的方法来解决这些问题。
  • 注意:OpenCL 错误代码是有符号的,而不是无符号的。换句话说,CL_BUILD_PROGRAM_FAILURE 是 -11,而不是 0xFFFFFFF5。

标签: java opencl lwjgl


【解决方案1】:

您可以通过调用clGetProgramBuildInfoCL_PROGRAM_BUILD_LOG 来查询构建日志。

在 LWJGL 中,有一个方便的方法:

...
clBuildProgram(program, devices.get(0), "", null);
System.out.println(program.getBuildInfoString(
    devices.get(0), CL_PROGRAM_BUILD_LOG));

这将打印构建程序产生的任何错误消息。


剩下的部分主要来自编辑这个答案之前的内容:

对于不同的 Java OpenCL 绑定,即来自 jocl.org 的 JOCL,我创建了这个实用程序方法。它是CL 类的一部分。然后调用CL.setExceptionsEnabled(true),如果程序构建失败,这个方法会在内部被调用,它的输出会是异常信息的一部分。展示了获取程序日志的基本流程,这里留作参考。

/**
 * Obtain a single String containing the build logs of the given program for
 * all devices that are associated with the given program object.
 *
 * @param program The program object
 * @return The build logs, as a single string.
 */
private static String obtainBuildLogs(cl_program program)
{
    int numDevices[] = new int[1];
    CL.clGetProgramInfo(program, CL.CL_PROGRAM_NUM_DEVICES, Sizeof.cl_uint, Pointer.to(numDevices), null);
    cl_device_id devices[] = new cl_device_id[numDevices[0]];
    CL.clGetProgramInfo(program, CL.CL_PROGRAM_DEVICES, numDevices[0] * Sizeof.cl_device_id, Pointer.to(devices), null);

    StringBuffer sb = new StringBuffer();
    for (int i=0; i<devices.length; i++)
    {
        sb.append("Build log for device "+i+":\n");
        long logSize[] = new long[1];
        CL.clGetProgramBuildInfo(program, devices[i], CL.CL_PROGRAM_BUILD_LOG, 0, null, logSize);
        byte logData[] = new byte[(int)logSize[0]];
        CL.clGetProgramBuildInfo(program, devices[i], CL.CL_PROGRAM_BUILD_LOG, logSize[0], Pointer.to(logData), null);
        sb.append(new String(logData, 0, logData.length-1));
        sb.append("\n");
    }
    return sb.toString();
}

【讨论】:

  • 是的,我想这正是我需要的。请将此移植到 LWJGL 版本。
  • @PavelRyzhov 我现在不能这样做(旧电脑),但明天晚上会这样做,相应地编辑答案,并给你留言(抱歉耽搁了)
  • 没关系,感谢您的通知,我在内核代码中发现了一个错字,但问题仍然存在。
  • @PavelRyzhov 我刚刚编辑了答案。最后,它是单行的,因为在 LWJGL 中有一个方便的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
相关资源
最近更新 更多