Sea*_*nch 41 c++ gpu-programming thrust boost-compute vexcl
通过对这些库的粗略理解,它们看起来非常相似.我知道VexCL和Boost.Compute使用OpenCl作为后端(尽管v1.0版本VexCL也支持CUDA作为后端)并且Thrust使用CUDA.除了不同的后端,这些之间的区别是什么.
具体来说,他们解决了什么问题空间,为什么我要使用其中一个.
另外,在Thrust常见问题解答中说明了这一点
OpenCL支持的主要障碍是缺少OpenCL编译器和运行时支持C++模板
如果是这种情况,VexCL和Boost.Compute怎么可能存在.
dde*_*dov 66
我是VexCL的开发者,但我真的很喜欢Boost.Compute的作者Kyle Lutz在Boost邮件列表上对同一主题所说的话.简而言之,从用户的角度来看,Thrust,Boost.Compute,AMD的Bolt和可能的Microsoft的C++ AMP都实现了类似STL的API,而VexCL是一个基于表达式模板的库,它本质上更接近Eigen.我相信类似STL的库之间的主要区别在于它们的可移植性:
同样,所有这些库都试图实现类似STL的接口,因此它们具有非常广泛的适用性.VexCL的开发考虑了科学计算.如果Boost.Compute的开发时间稍早,我可能会将VexCL建立在它之上:).另一个值得关注的科学计算库是ViennaCL,这是一个免费的开源线性代数库,用于计算多核架构(GPU,MIC)和多核CPU.看看[1]比较VexCL,ViennaCL,CMTL4和Thrust对于该领域.
关于Thrust开发人员引用无法添加OpenCL后端的信息:Thrust,VexCL和Boost.Compute(我不熟悉其他库的内部)都使用元编程技术来完成他们的工作.但是由于CUDA支持C++模板,Thrust开发人员的工作可能更容易一些:他们必须编写在C++编译器的帮助下生成CUDA程序的元程序.VexCL和Boost.Compute作者编写元程序,生成生成OpenCL源代码的程序.看一下我试图解释VexCL如何实现的幻灯片.所以我同意当前Thrust的设计禁止他们添加OpenCL后端.
[1] Denis Demidov,Karsten Ahnert,Karl Rupp,Peter Gottschling,编程CUDA和OpenCL:使用现代C++库的案例研究,SIAM J. Sci.Comput.,35(5),C453-C472.(也提供arXiv版本).
更新:@gnzlbg评论说在基于OpenCL的库中不支持C++仿函数和lambda.事实上,OpenCL基于C99,并且是在运行时从存储在字符串中的源代码编译的,因此没有简单的方法可以与C++类完全交互.但公平地说,基于OpenCL的库确实在某种程度上支持基于用户的功能甚至lambda.
话虽如此,基于CUDA的库(可能是C++ AMP)具有实际编译时编译器的明显优势(你甚至可以这么说吗?),因此与用户代码的集成可以更加紧密.