是否存在不是用C / C ++风格编写的OpenCL绑定?

时间:2014-06-25 09:01:04

标签: c++ binding opencl

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 ++界面,我真的不明白它们的意义。

2 个答案:

答案 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中有更多教程和示例。