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)