当我在我的OpenCl代码中使用clBuildProgram
时,它失败并显示错误代码-11而没有任何日志信息。
以下是我的代码:
ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
if (ret != CL_SUCCESS)
{
size_t len;
char buffer[2048];
cl_build_status bldstatus;
printf("\nError %d: Failed to build program executable [ %s ]\n",ret,get_error_string(ret));
ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_STATUS, sizeof(bldstatus), (void *)&bldstatus, &len);
printf("Build Status %d: %s\n",ret,get_error_string(ret));
printf("INFO: %s\n", get_error_string(bldstatus));
ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_OPTIONS, sizeof(buffer), buffer, &len);
printf("Build Options %d: %s\n",ret,get_error_string(ret));
printf("INFO: %s\n", buffer);
ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len);
printf("Build Log %d: %s\n",ret,get_error_string(ret));
printf("%s\n", buffer);
(void)infoinfo(platform_id,device_id);
exit(1);
}
以下是输出结果:
Error -11: Failed to build program executable [ CL_BUILD_PROGRAM_FAILURE ]
Build Status 0: CL_SUCCESS
INFO: CL_DEVICE_NOT_AVAILABLE
Build Options 0: CL_SUCCESS
INFO:
Build Log -30: CL_INVALID_VALUE
CL_PLATFORM_NAME : NVIDIA CUDA
CL_PLATFORM_VERSION : OpenCL 1.1 CUDA 4.2.1
Device name : Tesla K20m
Driver version : 319.32
Global Memory (MB) : 4799
Global Memory Cache (KB) : 208
Local Memory (KB) : 48
Max clock (MHz) : 705
Max Work Group Size : 1024
Number of parallel compute cores : 13
Is the device available : yes
所以,你们可能只是偶然发现上面的行中有任何错误或奇怪的东西吗?
谢谢,
埃里克。
答案 0 :(得分:7)
看起来您可能正在使用clGetProgramBuildInfo()错误。第一次调用时,它应该告诉主机需要缓冲区的大小:
clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, NULL, NULL, &len);
然后在主机上分配内存:
char *log = new char[len] //or whatever you use
然后回想起clGetProgramBuildInfo():
clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, len, log, null);
答案 1 :(得分:0)
我修改了代码并增加了缓冲区大小:
ret = clBuildProgram(program, 1, &device_id, NULL, NULL, NULL);
if (ret != CL_SUCCESS)
{
size_t len;
char buffer[204800];
cl_build_status bldstatus;
printf("\nError %d: Failed to build program executable [ %s ]\n",ret,get_error_string(ret));
ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_STATUS, sizeof(bldstatus), (void *)&bldstatus, &len);
if (ret != CL_SUCCESS)
{
printf("Build Status error %d: %s\n",ret,get_error_string(ret));
exit(1);
}
if (bldstatus == CL_BUILD_SUCCESS) printf("Build Status: CL_BUILD_SUCCESS\n");
if (bldstatus == CL_BUILD_NONE) printf("Build Status: CL_BUILD_NONE\n");
if (bldstatus == CL_BUILD_ERROR) printf("Build Status: CL_BUILD_ERROR\n");
if (bldstatus == CL_BUILD_IN_PROGRESS) printf("Build Status: CL_BUILD_IN_PROGRESS\n");
ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_OPTIONS, sizeof(buffer), buffer, &len);
if (ret != CL_SUCCESS)
{
printf("Build Options error %d: %s\n",ret,get_error_string(ret));
exit(1);
}
printf("Build Options: %s\n", buffer);
ret = clGetProgramBuildInfo(program, device_id, CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &len);
if (ret != CL_SUCCESS)
{
printf("Build Log error %d: %s\n",ret,get_error_string(ret));
exit(1);
}
printf("Build Log:\n%s\n", buffer);
exit(1);
}
我现在知道了:
Error -11: Failed to build program executable [ CL_BUILD_PROGRAM_FAILURE ]
Build Status: CL_BUILD_ERROR
Build Options:
Build Log:
:4:85: error: must specify ....
所以,它有效。
感谢您的帮助。