gpt4 book ai didi

c++ - 是否有不是以 C/C++ 风格编写的 OpenCL 绑定(bind)?

转载 作者:太空狗 更新时间:2023-10-29 20:59:32 24 4
gpt4 key购买 nike

CL/cl.hpp 中的当前 OpenCL C++ 绑定(bind)是对 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);

请注意,实际的错误处理代码并未显示,尽管在非异常情况下这可能会变得非常困惑。

我确信这样的绑定(bind)不会很难写,但边缘情况仍然是边缘情况,我更喜欢可靠的预写包装器。说我被宠坏了,但如果 C++ 绑定(bind)不提供真正的 C++ 接口(interface),我真的不明白它们的意义。

最佳答案

查看 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 的接口(interface),带有类似 vector<T> 的容器。和 array<T, N> 以及像 sort() 这样的算法和 transform() (以及其他功能,如随机数生成和 lambda 表达式支持)。

例如,对 float 的 vector 进行排序在您刚刚的设备上:

// 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中有更多教程和示例.

关于c++ - 是否有不是以 C/C++ 风格编写的 OpenCL 绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24404374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com