web-dev-qa-db-ja.com

VexCL、Thrust、Boost.Computeの違い

これらのライブラリーを大まかに理解するだけで、それらは非常によく似ています。 VexCLとBoost.ComputeはOpenClをバックエンドとして使用し(v1.0リリースVexCLもCUDAをバックエンドとしてサポートします)、ThrustはCUDAを使用することを知っています。異なるバックエンドを除いて、これらの違いは何ですか。

具体的には、彼らはどのような問題空間に対処し、なぜ私は他のものを使いたいのでしょうか。

また、推力FAQには、

OpenCLサポートの主な障壁は、C++テンプレートをサポートするOpenCLコンパイラーとランタイムがないことです。

この場合、VexCLとBoost.Computeが存在する可能性はありますか。

42
Sean Lynch

私は VexCL の開発者ですが、 Boost.Compute の作者である カイルルッツBoostメーリングリスト で同じ件名について述べなければならないことが本当に好きです。つまり、ユーザーの観点からは、 Thrust 、Boost.Compute、AMDの Bolt 、そしておそらくMicrosoftの C++ AMP はすべてSTLに似たAPIを実装していますが、VexCLは、 Eigen に近い。 STLのようなライブラリの主な違いは、その移植性です。

  1. ThrustはNVIDIA GPUのみをサポートしますが、OpenMPおよびTBBバックエンドを介してCPUでも動作する可能性があります。
  2. Boltは、AMD GPUでのみ利用可能なOpenCLのAMD拡張機能を使用します。また、Microsoft C++ AMPおよびIntel TBBバックエンドも提供します。
  3. Microsoft C++ AMPをサポートする唯一のコンパイラは、Microsoft Visual C++です( Bringing C++ AMP Beyond Windows に関する作業は行われています)。
  4. Boost.Computeは、標準のOpenCLに基づいているため、これらの中で最も移植性の高いソリューションのようです。

繰り返しますが、これらのライブラリはすべてSTLに似たインターフェイスを実装しようとしているため、非常に幅広い適用範囲を持っています。 VexCLは科学計算を念頭に置いて開発されました。 Boost.Computeが少し前に開発された場合、おそらくVexCLをベースにすることができます:)。注目に値する科学計算用のもう1つのライブラリは、 ViennaCL です。これは、メニーコアアーキテクチャ(GPU、MIC)およびマルチコアCPUでの計算用の無料のオープンソース線形代数ライブラリです。その分野のVexCL、ViennaCL、CMTL4、Thrustの比較については、[1]をご覧ください。

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++ファンクタとラムダのサポートがないとコメントしました。実際、OpenCLはC99に基づいており、実行時に文字列に格納されたソースからコンパイルされるため、C++クラスと完全に対話する簡単な方法はありません。しかし、公平を期すために、OpenCLベースのライブラリは、ユーザーベースの関数とある程度まではラムダもサポートしています。

とはいえ、CUDAベースのライブラリ(およびC++ AMPの場合もあります)には、実際のコンパイル時コンパイラー(明らかにそれとも言えるでしょう)の明らかな利点があるため、ユーザーコードとの統合をより緊密にすることができます。

68
ddemidov