VexCL,Thrust和Boost.Compute之间的区别

只是对这些库的粗略理解,它们看起来非常相似。 我知道VexCL和Boost.Compute使用OpenCl作为后端(虽然v1.0版本VexCL也支持CUDA作为后端),而Thrust使用CUDA。 除了不同的后端,这两者之间有什么不同。

具体来说,他们解决了什么样的问题空间,为什么要使用另一个。

另外,在Thrust FAQ上也是这样说的

OpenCL支持的主要障碍是缺less支持C ++模板的OpenCL编译器和运行库

如果是这样,VexCL和Boost.Compute甚至可能存在。

我是VexCL的开发人员,但是我真的很喜欢Boost.Compute的作者Kyle Lutz在Boost邮件列表上对同一主题的说明。 总而言之,从用户的angular度来看, Thrust ,Boost.Compute,AMD的Bolt以及可能是微软的C ++ AMP都实现了一个类似STL的API,而VexCL是一个更接近于Eigen的expression模板库。 我相信STL类库的主要区别在于它们的可移植性:

  1. Thrust仅支持NVIDIA GPU,但也可能通过OpenMP和TBB后端在CPU上工作。
  2. Bolt使用OpenCL的AMD扩展,这些扩展只能在AMD GPU上使用。 它还提供了Microsoft C ++ AMP和Intel TBB后端。
  3. 支持Microsoft C ++ AMP的唯一编译器是Microsoft Visual C ++(尽pipe正在完成有关使C ++ AMP超越Windows的工作)。
  4. Boost.Compute似乎是那些最便携的解决scheme,因为它基于标准的OpenCL。

同样,所有这些库都试图实现类似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的devise禁止他们添加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 ++函数和lambdaexpression式。 实际上,OpenCL基于C99,并且是在运行时从string中存储的源代码编译的,所以没有简单的方法可以与C ++类完全交互。 但是公平起见,基于OpenCL的库在某种程度上确实支持基于用户的function,甚至支持lambdaexpression式。

  • Boost.Compute提供了自己的简单lambdaexpression式实现 (基于Boost.Proto),并允许通过BOOST_COMPUTE_ADAPT_STRUCT和BOOST_COMPUTE_CLOSUREmacros与用户定义的结构进行交互 。
  • VexCL提供类似线性代数的DSL(也基于Boost.Proto),还支持将通用C ++algorithm和函子 (甚至Boost.Phoenix lambda)转换为OpenCL函数(有限制)。
  • 我相信AMD的Bolt通过其OpenCL扩展魔术的C ++支持用户定义的仿函数。

话虽如此,基于CUDA的库(也可能是C ++ AMP)具有实际编译时编译器的明显优势(你甚至可以这么说吗?),所以与用户代码的集成可以更加紧密。