これらのライブラリーを大まかに理解するだけで、それらは非常によく似ています。 VexCLとBoost.ComputeはOpenClをバックエンドとして使用し(v1.0リリースVexCLもCUDAをバックエンドとしてサポートします)、ThrustはCUDAを使用することを知っています。異なるバックエンドを除いて、これらの違いは何ですか。
具体的には、彼らはどのような問題空間に対処し、なぜ私は他のものを使いたいのでしょうか。
また、推力FAQには、
OpenCLサポートの主な障壁は、C++テンプレートをサポートするOpenCLコンパイラーとランタイムがないことです。
この場合、VexCLとBoost.Computeが存在する可能性はありますか。
私は VexCL の開発者ですが、 Boost.Compute の作者である カイルルッツ が Boostメーリングリスト で同じ件名について述べなければならないことが本当に好きです。つまり、ユーザーの観点からは、 Thrust 、Boost.Compute、AMDの Bolt 、そしておそらくMicrosoftの C++ AMP はすべてSTLに似たAPIを実装していますが、VexCLは、 Eigen に近い。 STLのようなライブラリの主な違いは、その移植性です。
繰り返しますが、これらのライブラリはすべて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の場合もあります)には、実際のコンパイル時コンパイラー(明らかにそれとも言えるでしょう)の明らかな利点があるため、ユーザーコードとの統合をより緊密にすることができます。