OpenCL:如何使用 C++ 包装器检查构建错误

Posted

技术标签:

【中文标题】OpenCL:如何使用 C++ 包装器检查构建错误【英文标题】:OpenCL: How to check for build errors using the C++ wrapper 【发布时间】:2016-01-07 18:18:06 【问题描述】:

如果我从这样的源代码构建一个 openCL 程序

cl::Program program = cl::Program(context, sourceCode);
program.build(devices);

我想检查一下这是否成功。我看到了一些如何在 C 中执行此操作的示例,但是由于我的项目在 C++ 中,我想知道如何(以防出现问题)获得一条可读的文本消息,该消息指示使用 C++ 包装器可能出现的问题。

我也启用了例外

#define CL_HPP_ENABLE_EXCEPTIONS 

但不知道build(...)会不会抛出异常。

我正在使用 AMD APP SDK 3.0 和来自 Khronos 网页的 cl2.hpp(因为它未包含在 SDK 中)。

【问题讨论】:

【参考方案1】:

如果构建失败,cl::Program::build() 函数确实会抛出异常。以下是获取构建日志的方法:

cl::Program program = cl::Program(context, sourceCode);
try

  program.build(devices);

catch (cl::Error& e)

  if (e.err() == CL_BUILD_PROGRAM_FAILURE)
  
    for (cl::Device dev : devices)
    
      // Check the build status
      cl_build_status status = program.getBuildInfo<CL_PROGRAM_BUILD_STATUS>(dev);
      if (status != CL_BUILD_ERROR)
        continue;

      // Get the build log
      std::string name     = dev.getInfo<CL_DEVICE_NAME>();
      std::string buildlog = program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(dev);
      std::cerr << "Build log for " << name << ":" << std::endl
                << buildlog << std::endl;
  
  else
  
    throw e;
  

【讨论】:

如果我有多个设备,我想我还应该检查其他设备(如果它们不相同),我猜? @MrZ 是的。我已经更新了我的答案,您可以如何检查每个设备的构建是否失败并打印日志(如果是)。构建可能会在一台设备上成功,但在另一台设备上失败。 我认为有一种类型你叫getInfo,你的d应该是dev @MrZ 是的,很抱歉!固定。

以上是关于OpenCL:如何使用 C++ 包装器检查构建错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 PySide2 构建找不到生成的 C++ 包装器?

如何将 C++ dll 静态链接到 .NET 库(将 c++ dll 构建到网络包装器 dll 以获取一个 dll)

OpenCL 内核的定时执行

C++ 库的 JNI 包装器和未定义的符号错误

使用 SWIG 围绕 C++ 的 Python 包装器。参数类型无法识别

Python:C++ 的包装器需要访问 .dll 文件