当我调用CL10.clBuildProgram(program, devices.get(0), "", null)
方法时,它会抛出org.lwjgl.opencl.OpenCLException: Error Code: CL_BUILD_PROGRAM_FAILURE (0xFFFFFFF5)
异常。我所知道的一切都是构建失败,但我在内核代码中没有弄清楚我的错误。
如何在出现此错误后获取内核编译器的staktrace?
答案 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();
}