使用可能な高速C ++マトリックスライブラリの推奨事項


158

使用可能な高速C ++マトリックスライブラリに関する推奨事項はありますか?

使用可能とは、次のことを意味します。

  • マトリックスオブジェクトには直感的なインターフェイスがあります(例:インデックス作成中に行と列を使用できます)
  • LAPACKおよびBLASで実行できるマトリックスクラスで何でもできます。
  • 簡単に習得して使用できるAPI
  • Linuxにインストールするのは比較的簡単です(現在Ubuntu 11.04を使用しています)

私にとっては、早すぎる最適化を避けるために、現在、速度やメモリ使用よりもユーザビリティが重要です。コードを書く際、私は常に1-D配列(またはSTLベクトル)と適切なインデックスまたはポインター演算を使用して行列をエミュレートできましたが、バグを避けるためにしたくないです。また、行列をエミュレートするために使用した小さなプログラミングトリックのすべてを思い出すために私の限られた注意の一部を使用するのではなく、解決しようとしている実際の問題と問題領域にプログラムしようとする精神的な努力に焦点を当てたい、LAPACKコマンドなどを覚えておいてください。さらに、記述しなければならないコードが少なくなり、コードが標準化されるほど、より良い結果が得られます。

密か疎かはまだ関係ありません。私が扱っているマトリックスの一部はスパースになりますが、すべてではありません。ただし、特定のパッケージが密行列または疎行列を適切に処理する場合は、言及する価値があります。

テンプレートを作成することも重要ではありません。標準の数値型を使用し、double、float、int以外を保存する必要がないからです。いいですが、私がやりたいことには必要ありません。


1
CUDAの使用はオプションですか?
フリップチャート

1
それは後である可能性があります。CUDAには興味がありません。なぜなら、マトリックス乗算が私の懸念の最も少ないアプリケーション用のライブラリを構築しているからです。この努力の大部分は、混合整数線形プログラムソルバーの呼び出しに費やされるため、CUDAの使用はやり過ぎです。論文を終えた後、線形代数がより多く、最適化中心がより少ないアルゴリズムを検討する予定です。ただし、CUDAライブラリについての経験がある場合は、CUDAライブラリについて投稿することをお勧めします。他の人があなたの考えを知りたいと思うからです。
ジェフオックスベリー

Intel MKLとIPPはどうですか?
ロイ

回答:


146

私はこれまでにオンライン調査から以下を収集しました:

私は少しArmadilloを使用しましたが、インターフェースが十分に直感的であることがわかり、Ubuntuのバイナリパッケージを見つけるのは簡単でした(そして、他のLinuxディストリビューションを想定しています)。私はソースからそれをコンパイルしていませんが、私の希望はそれがそれほど難しくないことです。それは私の設計基準のほとんどを満たし、密な線形代数を使用します。LAPACKまたはMKLルーチンを呼び出すことができます。通常、Armadilloをコンパイルする必要はありません。純粋にテンプレートベースのライブラリです。ヘッダーとBLAS / LAPACKまたはMKLなどへのリンクを含めるだけです。

Eigenについて良いことを聞いたことがありますが、使用していません。高速であると主張し、テンプレートを使用し、密な線形代数をサポートします。依存関係としてLAPACKやBLASはありませんが、LAPACKでできることはすべて実行できるようです(さらに、LAPACKではできないこともできます)。多くのプロジェクトでEigenが使用されていますが、これは有望です。Ubuntu用のバイナリパッケージがありますが、ヘッダーのみのライブラリとして他の場所でも使用するのは簡単です。

マトリックステンプレートライブラリのバージョン4にも有望に見える、とテンプレートを使用しています。密および疎線形代数の両方をサポートし、UMFPACKを疎ソルバーとして呼び出すことができます。機能は、彼らのウェブサイトからやや不明瞭です。Ubuntuのバイナリパッケージがあり、Webサイトからダウンロードできます。

Argonne National Laboratoryのチームによって作成されたPETScは、スパースおよびデンスの線形ソルバーにアクセスできるため、マトリックスライブラリとして機能できると考えています。Cで書かれていますが、C ++バインディングがあります(そうでなくても、C ++からCを呼び出しても問題ありません)。ドキュメントは非常に徹底的です。このパッケージは、私が今やりたいこと(混合整数線形プログラムをセットアップするための行列の乗算とインデックス付け)に対して少しやり過ぎですが、将来、またはさまざまなニーズを持つ他の人々のための行列形式として役立つ可能性があります私よりも。

サンディア国立研究所のチームが作成したTrilinosは、Epetraコンポーネントを介して密行列と疎行列のオブジェクト指向C ++インターフェイスを提供し、Tpetraコンポーネントを介して密行列と疎行列のテンプレートインターフェイスを提供します。また、線形ソルバーと固有値ソルバーの機能を提供するコンポーネントもあります。ドキュメントは、PETScほど洗練されていたり、目立っているようには見えません。トリリノスは、PETScのサンディアのアナログのようです。PETScは、Trilinosソルバーのいくつかを呼び出すことができます。TrilinosのバイナリはLinuxで利用可能です。

Blitzは、Linuxバイナリを含むC ++オブジェクト指向ライブラリです。メーリングリストはアクティブですが、積極的にメンテナンスされているようには見えません(2012-06-29:昨日新しいバージョンが登場しました!)。BLASを超えた数値線形代数の方法ではあまり効果がなく、密なマトリックスライブラリのように見えます。テンプレートを使用します。

Boost :: uBLASはC ++オブジェクト指向ライブラリであり、Boostプロジェクトの一部です。テンプレートと密な数値線形代数をサポートします。それほど高速ではないと聞いたことがあります。

テンプレート数値Toolkitは、 NISTが開発したC ++オブジェクト指向のライブラリです。その作者であるRoldan Pozoは、時々パッチを提供しているようですが、もはや活発に開発されていないようです(最終更新は2010年でした)。密な線形代数に焦点を当て、いくつかの基本的な行列分解と固有値ソルバーのインターフェイスを提供します。

Jack Poulsonが開発したElementalは、FLAMEに似たスタイルで記述された分散メモリ(並列)高密度線形代数ソフトウェアパッケージです。プロジェクトの機能と背景のリストについては、彼のドキュメントを参照してください。FLAME自体には、オブジェクト指向のCで記述されているlibflameと呼ばれる、シーケンシャルおよび共有メモリの密な線形代数のライブラリが関連付けられています。線形代数ライブラリは、より科学的であり、黒人の芸術ではありません。

リストに追加できるライブラリは他にもあります。スパース線形代数パッケージを「マトリックスライブラリ」として数えている場合、Cで知っている最高のフリー代数は、オブジェクト指向スタイルでプログラムされたSuiteSparseです。SuiteSparseを使用しましたが、かなり簡単に手に入れることができました。スパース問題を多数の小さくて密度の高い線形代数の部分問題に分解するアルゴリズムの一部は、BLASとLAPACKに依存しています。このパッケージの主執筆者であるティム・デイビスは、信じられないほど役に立ち、万能の男です。

ハーウェルサブルーチンライブラリフォームに必要事項を記入して、ダウンロードしたいファイルごとに電子メールを受信するこのプロセスを通過する必要があるものの、そのスパース線形代数ルーチンのために有名であり、学術的なユーザーのための無料です。サブルーチンには多くの場合依存関係があるため、1つのソルバーを使用するには5つまたは6つのファイルをダウンロードする必要があり、特にフォームの承認が即座に行われないため、プロセスは多少面倒になります。

他のスパース線形代数ソルバーもありますが、私が知る限り、MUMPSと他のパッケージは主に線形システムのソリューションに焦点を当てており、線形システムの解決は今のところ私の懸念事項ではありません。(たぶん後で、その機能が必要になるでしょうし、他の人にとっても役に立つかもしれません。)


2
EigenとElementalを混同していると思います。このプロジェクトには非常に感銘を受けましたが、Eigenには取り組んでいません。Elementalは主に分散メモリマシンを対象としています。
ジャックポールソン

3
私の最初の質問は次のようになると思います:何かを並行して実行したいですか?
マットネプリー

1
Trilinosに言及する必要があります...ここでは(まだ)あまり目立ちませんが、テンプレート化されたマトリックスパッケージ、固有値ソルバー、スパースマトリックスソルバーを備えたPETScの実行可能な代替物であり、パッケージもありますアルゴリズムの簿記を抽象化するためのものでしたが、どのように機能するかはわかりません。
アンドリュースポット

1
Eigenは素晴らしいようです-私の同僚はプロのコンテキストでそれを使用し、パフォーマンスを犠牲にすることなくあなたを十分に素早く稼働させることができます。
qdot

7
また、次のライブラリを回答に追加します。ViennaCL - EigenおよびMTLにインターフェイスできるOpenCLベースのC ++ヘッダーライブラリ。 PLASMA -タイルベースの分解をフィーチャーしBLASとLAPACKライブラリのUTKベースの再設計。 MAGMA -LAPACK / BLASパフォーマンスの改善に焦点を当てた別のUTKプロジェクト。
アロンアーマディア

24

このドキュメントは、科学ライブラリ用の線形代数ライブラリの選択を支援するために2009年3月に作成されました。Eigen、GSL、Lapack ++ MTL、PETSc、Trilinos、uBlasなどのいくつかのライブラリの移植性、高レベルインターフェイス、およびライセンスを評価します。特にFlensSeldonが好きなようです。(要件の1つは、C ++テンプレートとスパース行列をサポートする必要があることでした。)


17

上記のすべてのプロジェクトのうち、非常に広く使用されている(そして正当な理由により)重量級は2つだけです:PETScとTrilinos。どちらも専門的に開発されており、大規模な開発者ベースを持っています。他のすべては、これら2つに比べてかなり小さなプロジェクトです。(i)長期にわたってサポートされ、(ii)必要なすべての機能をすでに備えている可能性があるため、一緒に行くことをお勧めします。線形代数(さらにその上)。


4
PETScには、ScaLAPACKおよびPLAPACKへのわずかに抽象的なインターフェース以上のものはありません。ジェフが便利な密な線形代数に興味があるなら、PETScはやりすぎだと思う(コメントするトリリノスの密な能力については十分に知らない)
アロン

@AronAhmadia:この時点で、答えはより多くのコミュニティWikiリソースに変化したと思います。これが、コメント者のリクエストでパッケージを追加している理由です。
ジェフオックスベリー

3
@WolfgangBangerth:設計目標について言及することは重要だと思います。目的が長続きし、他の人が使用することを意図したソフトウェアを書くことであり、線形代数がそのソフトウェアの不可欠な部分である場合、PETScとTrilinosは良い選択です。ただし、よりシンプルなAPIを使用し、より少ないコード行でほぼ同じタスクを実行できるため、より軽量なオプションが望ましいと便利な場合があります。最後に、選択バイアスはコードの存続に役割を果たします。誰も小さなコードを使用しない場合、それらは持続せず、PETScやTrilinosのようなベースを構築しません。
ジェフオックスベリー

1
Geoffが述べたことに加えて、PETScとTrilinosの機能の大部分は外部ライブラリのラッパーから来ています。誰もこの外部ライブラリを直接使用してはならないということは、私には奇妙に思えます。
ジャックポールソン

1
@JackPoulson:私は実際にコメントを待っています。はい、PETScは多くの個々のパッケージをラップします。ただし、統一されたインターフェースでこれを行うため、各パッケージの命名規則とスタイルの特性を学習するよりも、これを一度学習する方が簡単です。言い換えれば、個々のプロジェクトはラップされたパッケージを等しく使用するかもしれませんが、PETScを介してそれらを使用することから生じる相乗効果があります。
ウルフギャングバンガース

11

お望みならば

  • 直感的なインターフェイスを備えたマトリックスクラス
  • すべてのLAPACKおよびBLAS機能
  • 簡単に習得して使用できるAPI
  • インストールが簡単

それから、私のライブラリFLENSをご覧になることをお勧めします。私はまさにこの種のタスク用に設計しました。ただし、C ++ 11準拠のコンパイラ(gcc 4.7またはclangなど)が必要です。

FLENSは、基礎となるBLAS実装とまったく同じパフォーマンスを提供します。 これを示すいくつかの(かなり古い)ベンチマークがあります

FLENS-LAPACKについても同じことが言えます。同じBLAS実装を使用すると、NetlibのLAPACKとまったく同じパフォーマンスが得られます。

新しいベンチマークに関しては、さらに詳しく説明します...

しばらく前に、私はClint Whaley(ATLASの著者)に、彼がEigenサイトで公開されたベンチマークについてどう思うかを尋ねました。彼は、これらのベンチマークが信頼できない可能性が高いという私の疑いを確認しました。それまでの間、クリントが提案した方法で、他のいくつかのベンチマークを実現しました。詳細はATLASサイトおよびEigenメーリングリストで確認できます。ベンチマークはグラフではうまく表示されませんが、ATLASは常にEigenよりも約40%高速であることを示しています。これは、Eigenサイトのベンチマークと矛盾しますが、他のベンチマーク(blaze-libのベンチマークなど)を確認します。

密な数値線形代数の場合、行列行列積が最も重要であることに注意してください。個人的には、EigenとATLASのどちらが速いかは気にしません。EigenがATLASよりも高速である場合、EigenをBLASバックエンドとして使用します。

免責事項:はい、FLENSは私の赤ちゃんです!つまり、私はそれの約95%をコーディングし、コードのすべての行はそれだけの価値がありました:-)


こんにちはマイケル、scicompへようこそ。URLが機能していませんが、サーバーに何か問題がありますか?
アロンアフマディア

ヒントをありがとう。URLは正しいですが、ファイルサーバーの数学部門で問題が発生しているようです。週末に間に合うように...
マイケルレーン

1
OK、現在のgitリポジトリから新しいドキュメントを作成し、別のサーバーにコピーしました:apfel.mathematik.uni-ulm.de/~lehn/FLENS/index.html
Michael Lehn



1

テンソル操作などを実行するために、たとえば有限要素行列を組み立てるときに一般的に使用される、小さなサイズの行列を処理するための最適な行列ライブラリは何でしょうか。

私はすでにアプリケーションで発生する大規模なスパース線形システムのソリューションにPETScを使用していますが、現在、これらの行列/ベクトルを扱うために自分のシンプルなライブラリを使用しています...より高速なライブラリへの移行を検討しています上記のものと同じです。

PETScと組み合わせるのに最適な選択肢は何ですか?エイゲン?アルマジロ?BOOST :: uBlas?MTL4?BOOSTの一部を使用するため、最初にBOOST :: uBlasの使用を考えましたが、ドキュメントや例などはあまりありません...


2
最適化されたBLASルーチンよりも1桁遅いことがわかっているため、uBlasの使用は強くお勧めします。Eigenは、巧妙なテンプレートトリックのおかげで、非常に小さなマトリックスに最も適していると思います。
ジャックポールソン

1
これはおそらく別の質問の方が良いでしょう。Eigen、MTL4、およびArmadilloにはすべて小さなサイズのシステムを解決するためのトリックがあることは知っていますが、マトリックスを組み立てる方法を求めていると思いますが、それについては知りません。私は通常、行列を要素ごとに組み立てます。上記のライブラリのいずれかがPETScとの結合に適しているかどうかはわかりません。私はまだPETScユーザーではありません。Boost :: uBlasについての2番目のJackのコメントは、遅いためです。
ジェフオックスベリー

1

Armadillo、Boostなどは、Jempベースの高速C ++テクニカルコンピューティング環境であるCeempleの一部として含まれるようになりました。http://www.ceemple.comから入手可能(無料)。


0

驚いた人はこれまでTooNについて言及していません。ほぼ3年間、これを喜んで使用しています。

包括的ではありませんが、Eigenに非常に似ています。しかし、いくつかの点でより良い構文を持っていると思います。

また、Lieグループ(2次元と3次元の特別なユークリッド/直交など)および関連するLie代数に基づいて、グラフィックスとビジョンで頻繁に発生する一般的な変換のモデリングを支援するクラスが付属しています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.