我是VexCL的开发人员,但我真的很喜欢Boost.Compute的作者Kyle Lutz在Boost 邮件列表上就同一主题所说的话。简而言之,从用户的角度来看, Thrust、Boost.Compute、AMD 的Bolt以及可能是微软的C++ AMP都实现了类似 STL 的 API,而 VexCL 是一个基于表达式模板的库,本质上更接近于Eigen。我相信类似 STL 的库之间的主要区别在于它们的可移植性:
- Thrust 仅支持 NVIDIA GPU,但也可以通过其 OpenMP 和 TBB 后端在 CPU 上工作。
- Bolt 使用 AMD 对 OpenCL 的扩展,这些扩展仅在 AMD GPU 上可用。它还提供 Microsoft C++ AMP 和 Intel TBB 后端。
- 唯一支持 Microsoft C++ AMP 的编译器是 Microsoft Visual C++(尽管有关将 C++AMP 超越 Windows的工作正在进行中)。
- Boost.Compute 似乎是其中最便携的解决方案,因为它基于标准 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 的设计禁止他们添加 OpenCL 后端。
[1] Denis Demidov、Karsten Ahnert、Karl Rupp、Peter Gottschling,CUDA 和 OpenCL 编程:使用现代 C++ 库的案例研究,SIAM J. Sci。计算机,35(5),C453–C472。(arXiv 版本也可用)。
更新:@gnzlbg 评论说在基于 OpenCL 的库中不支持 C++ 函子和 lambda。事实上,OpenCL 基于 C99 并在运行时从存储在字符串中的源代码编译,因此没有简单的方法与 C++ 类进行完全交互。但公平地说,基于 OpenCL 的库确实在某种程度上支持基于用户的函数甚至 lambda。
话虽如此,基于 CUDA 的库(可能是 C++ AMP)在实际编译时编译器方面具有明显的优势(你能这么说吗?),因此与用户代码的集成可以更加紧密。