clBuildProgram失败,错误代码为-11且没有构建日志

Akh*_*Ali 8 opencl

我现在在OpenCL中工作不多,但最近"clBuildProgram"在我的一个程序中失败了.我的代码摘录如下:

cl_program program;
program = clCreateProgramWithSource(context, 1, (const char**) &kernel_string, NULL, &err);
if(err != CL_SUCCESS)
{
cout<<"Unable to create Program Object. Error code = "<<err<<endl;
exit(1);
}
if(clBuildProgram(program, 0, NULL, NULL, NULL, NULL) != CL_SUCCESS)
{
cout<<"Program Build failed\n";
size_t length;
char buffer[2048];
clGetProgramBuildInfo(program, device_id[0], CL_PROGRAM_BUILD_LOG, sizeof(buffer), buffer, &length);
cout<<"--- Build log ---\n "<<buffer<<endl;
exit(1);
}
Run Code Online (Sandbox Code Playgroud)

通常早些时候,在"clBuildProgram"失败的情况下,在"clBuildProgram"函数的帮助下,在"clGetProgramBuildInfo()"函数的帮助下,我在内核文件中得到了语法或其他错误,但是当这个程序运行时,在控制台上它只打印:

程序构建失败---构建日志---

当我试图打印"clBuildProgram"返回的错误代码时; 它是"-11"......我的内核文件有什么问题,我没有得到任何构建失败信息?

Jam*_*mes 10

您可以通过在cl.h中搜索来了解OpenCL错误代码的含义.在这种情况下,-11正是您所期望的,CL_BUILD_PROGRAM_FAILURE.毫无疑问,构建日志是空的.两个问题:

1.)clGetProgramBuildInfo的返回值是多少?

2.)你在哪个平台上?如果您使用的是Apple的OpenCL实现,则可以尝试在您的环境中设置CL_LOG_ERRORS = stdout.例如,从终端:

$ CL_LOG_ERRORS = stdout ./myprog

在Xcode(编辑方案 - >参数 - >环境变量)中设置它也很容易.


小智 5

如果您使用 C 而不是 C++:

err = clBuildProgram(program, 0, NULL, NULL, NULL, NULL); 

////////////////Add the following lines to see the log file///////////

if (err != CL_SUCCESS) {
char *buff_erro;
cl_int errcode;
size_t build_log_len;
errcode = clGetProgramBuildInfo(program, devices[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &build_log_len);
if (errcode) {
            printf("clGetProgramBuildInfo failed at line %d\n", __LINE__);
            exit(-1);
        }

    buff_erro = malloc(build_log_len);
    if (!buff_erro) {
        printf("malloc failed at line %d\n", __LINE__);
        exit(-2);
    }

    errcode = clGetProgramBuildInfo(program, devices[0], CL_PROGRAM_BUILD_LOG, build_log_len, buff_erro, NULL);
    if (errcode) {
        printf("clGetProgramBuildInfo failed at line %d\n", __LINE__);
        exit(-3);
    }

    fprintf(stderr,"Build log: \n%s\n", buff_erro); //Be careful with  the fprint
    free(buff_erro);
    fprintf(stderr,"clBuildProgram failed\n");
    exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)