如何获取OpenCL内核编译器的堆栈跟踪?

时间:2014-06-14 10:54:15

标签: java opencl lwjgl

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

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

1 个答案:

答案 0 :(得分:3)

您可以使用clGetProgramBuildInfo调用CL_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();
}