C++ VexCL、推力和增压之间的差异。计算

C++ VexCL、推力和增压之间的差异。计算,c++,thrust,gpu,boost-compute,vexcl,C++,Thrust,Gpu,Boost Compute,Vexcl,对这些库的理解很粗略,它们看起来非常相似。我知道VexCL和Boost.Compute使用OpenCl作为后端(尽管v1.0版本VexCL也支持CUDA作为后端),而推力使用CUDA。除了不同的后端,它们之间的区别是什么 具体来说,他们解决了什么问题空间,为什么我要使用一个而不是另一个 此外,在推力常见问题解答中指出 OpenCL支持的主要障碍是缺少OpenCL编译器和运行时,支持C++模板 如果是这样的话,VexCL和Boost.Compute怎么可能存在呢。我是的开发者,但我真的很喜欢,这

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

具体来说,他们解决了什么问题空间,为什么我要使用一个而不是另一个

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

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

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

我是的开发者,但我真的很喜欢,这本书的作者,在同一主题上所说的话。简而言之,从用户的角度来看,Boost.Compute、AMD和微软都实现了类似STL的API,而VexCL是一个基于表达式模板的库,在本质上更接近于STL。我相信类似STL的库之间的主要区别在于它们的可移植性:

  • 推力仅支持NVIDIA GPU,但也可以通过其OpenMP和TBB后端在CPU上工作
  • 博尔特使用AMD对OpenCL的扩展,这些扩展仅在AMD GPU上可用。它还提供微软C++ AMP和英特尔TBB后端。
  • 支持微软C++AMP的唯一编译器是微软Visual C++(虽然正在进行Ont/C++)。
  • Compute似乎是其中最可移植的解决方案,因为它基于标准OpenCL
  • 同样,所有这些库都试图实现类似STL的接口,因此它们具有非常广泛的适用性。VexCL的开发考虑到了科学计算。如果Boost.Compute开发得稍早一点,我可能会将VexCL建立在它之上:)。另一个值得一看的科学计算库是一个免费的开源线性代数库,用于在许多核心架构(GPU、MIC)和多核CPU上进行计算。查看[1]以比较该领域的VexCL、ViennaCL、CMTL4和推力

    关于所引用的推力开发人员无法添加OpenCL后端的问题:推力、VexCL和Boost.Compute(我不熟悉其他库的内部结构)都使用元编程技术。但是由于CUDA支持C++模板,推力开发人员的工作可能更容易一些:他们必须编写用C++编译器帮助生成CUDA程序的元程序。Compute的作者编写元程序,生成生成OpenCL源代码的程序。看一看我试图解释VexCL是如何实现的。所以我同意当前的推力设计禁止他们添加OpenCL后端

    [1] Denis Demidov、Karsten Ahnert、Karl Rupp、Peter Gottschling、SIAM J.Sci。计算机,35(5),C453-C472。(还提供了一份报告)

    更新:@ GNZLBG评论说,在基于OpenCL的库中,没有支持C++函数和lambDas。事实上,OpenCL是基于C99的,并且是从运行时存储在字符串中的源编译的,所以没有简单的方式与C++类完全交互。但公平地说,基于OpenCL的库确实支持基于用户的函数,甚至在某种程度上支持lambda

    • Compute提供自己的(基于Boost.Proto),并允许通过和宏与用户定义的结构交互
    • VexCL提供了类似DSL的线性代数(也基于Boost.Proto),以及OpenCL函数(甚至包括Boost.Phoenix lambdas)(有限制)
    • 我相信AMD的Bolt确实通过其扩展魔法支持用户定义的函子

    已经说过,基于CUDA的库(可能是C++ + AMP)有明显的优点,编译时编译器(你能说吗?),所以与用户代码的集成可以更紧密。< / P>不要忘记C++ +AMP!您可能需要补充的是,虽然基于OpenCL的库不支持函数对象(和lambda)作为内核,但那些不基于OpenCL的库通常都支持。非常好地总结了这些库中的功能,以模拟函数对象支持!干得好!C++中的OpenC++扩展魔术,你提到的AMD的螺栓只是c++ AMP。他们支持。这似乎只是一个模板函数,但他们使用模板在OpenCL字符串内。那是标准的OpenCL还是AMD专用的?我不知道你能做到!是的,我可能错过了一点。这是分机。这是一个例子。