【问题标题】:clBuildProgram failed with error code -11 and without build logclBuildProgram 失败,错误代码为 -11 且没有构建日志
【发布时间】:2011-10-21 16:43:55
【问题描述】:

我现在在 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);
}

通常早些时候,每当“clBuildProgram”失败时,我会借助“clGetProgramBuildInfo()”函数在内核文件中遇到语法或其他错误,但是当该程序运行时,它只会在控制台上打印:

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

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

【问题讨论】:

    标签: opencl


    【解决方案1】:

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

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

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

    $ CL_LOG_ERRORS=stdout ./myprog

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我将程序更改为使用 AMD GPU,并且成功了。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2018-11-29
          • 1970-01-01
          • 2016-12-13
          • 1970-01-01
          • 2014-02-17
          • 2012-07-28
          • 1970-01-01
          • 2019-05-07
          • 2017-11-13
          相关资源
          最近更新 更多