Opencl clBuildProgram失败,错误代码为-11,并且没有生成日志

Opencl clBuildProgram失败,错误代码为-11,并且没有生成日志,opencl,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. Er

我现在在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);
}
cl_程序;
program=clCreateProgramWithSource(上下文,1,(常量字符**)和内核字符串,NULL和err);
如果(错误!=CL_成功)
{

cout您可以通过在cl.h中搜索来了解OpenCL错误代码的含义。在这种情况下,-11正是您所期望的,cl\u BUILD\u PROGRAM\u失败。构建日志为空确实很奇怪。有两个问题:

1.)clGetProgramBuildInfo的返回值是多少

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

$CL\u LOG\u ERRORS=stdout./myprog


在Xcode(编辑方案->参数->环境变量)中设置这一点也很容易。

如果您使用的是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);
}

我在一个空日志文件中遇到了同样的问题。我在另一台计算机上测试我的ocl内核。它有两个平台,而不是一个。一个Intel GPU和一个AMD GPU。我只安装了AMD ocl SDK。安装Intel ocl SDK解决了这个问题。同时选择AMD平台而不是Intel GPU平台也解决了这个问题。

我看到了n当OpenCL内核源代码缺少
\u kernel
属性标记时,OSX 10.14.6上会发生这种情况。如果
\u kernel
标记和返回类型都丢失,则系统OpenCL编译器守护进程似乎会崩溃,然后需要几秒钟重新启动,新内核才能再次编译。

我将程序更改为使用AMD G普,这很有效。