CL/cl.hpp
中的当前OpenCL C ++绑定是C OpenCL API上的非常瘦包装器。我理解为什么这样做的原因,虽然我真的不是。
是否有任何现有的替代包装器依赖于异常作为错误处理,允许人们只编写这样的代码:
auto platform_list = cl::Platform::get();
因为,RVO和可读性等等,而不是当前的
std::vector<cl::Platform> platform_list;
auto error = cl::Platform::get(&platformList);
if(error != CL_SUCCESS)
或者,如果有人选择进行异常处理(通过定义__CL_ENABLE_EXCEPTIONS
):
std::vector<cl::Platform> platform_list;
cl::Platform::get(&platformList);
请注意,未显示实际的错误处理代码,但在非例外情况下,这可能会非常混乱。
我确定这样的绑定不会非常难以编写,但边缘情况仍然是边缘情况,我更喜欢一个可靠的预先写好的包装器。叫我被宠坏了,但如果C ++绑定不提供真正的C ++界面,我真的不明白它们的意义。
答案 0 :(得分:2)
C ++包装器被设计为OpenCL之上的一个薄层,因此它们可以作为头文件包含在内。有一些C ++ / OpenCL库为C ++提供各种支持,例如AMD Bolt。
有一个关于C ++的层/库的建议,即SYCL。它比包装器稍微复杂一些,因为它需要设备编译器来生成OpenCL内核,但提供(IMHO)良好的抽象和异常处理。 临时规范is already available,已经有(正在进行的工作)open source implementation。
答案 1 :(得分:2)
查看Boost.Compute库。它仅支持头文件,并为基于OpenCL的GPGPU /并行计算提供高级C ++ API。
获取平台列表如下所示:
for(auto platform : boost::compute::system::platforms()){
std::cout << platform.vendor() << std::endl;
}
它使用异常进行错误处理(这大大减少了所需的显式检查量,并在失败时提供了更好的错误消息):
try {
// attempt to compile to program
program.build();
}
catch(boost::compute::opencl_error &e){
// program failed to compile, print out the build log
std::cout << program.build_log() << std::endl;
}
除此之外,它还提供类似STL的界面,其中包含vector<T>
和array<T, N>
等容器以及sort()
和transform()
等算法(以及其他随机数生成和lambda表达支持等功能。)
例如,要在设备上对float
s的矢量进行排序,您只需:
// vector of floats on the device
boost::compute::vector<float> vec = ...;
// sort the vector
boost::compute::sort(vec.begin(), vec.end(), queue);
// copy the sorted vector back to the host
boost::compute::copy(vec.begin(), vec.end(), host_vec.begin(), queue);
documentation中有更多教程和示例。