42

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

具体来说,他们解决了哪些问题空间以及我为什么要使用其中一个。

此外,在推力常见问题解答中指出

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

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

4

1 回答 1

69

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

  1. Thrust 仅支持 NVIDIA GPU,但也可以通过其 OpenMP 和 TBB 后端在 CPU 上工作。
  2. Bolt 使用 AMD 对 OpenCL 的扩展,这些扩展仅在 AMD GPU 上可用。它还提供 Microsoft C++ AMP 和 Intel TBB 后端。
  3. 唯一支持 Microsoft C++ AMP 的编译器是 Microsoft Visual C++(尽管有关将 C++AMP 超越 Windows的工作正在进行中)。
  4. 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)在实际编译时编译器方面具有明显的优势(你能这么说吗?),因此与用户代码的集成可以更加紧密。

于 2013-11-23T05:49:11.373 回答