web-dev-qa-db-ja.com

Boost :: uBLAS vs Eigen

私はほとんどすべての数学的線形代数の仕事でEigenに慣れています。最近、Boostが基本線形代数ライブラリ( Boost :: uBLAS )を提供するC++テンプレートクラスライブラリも提供していることを発見しました。これは、ブーストがすでに私のコードの主要なライブラリであるため、ブーストのみに基づいてすべての作業を取得できるかどうか疑問に思いました。

両方を詳しく調べても、実際にはそれらを明確に区別することはできませんでした。

  • Boost :: uBLAS:

uBLASは、密、単位、疎のベクトル、密、同一性、三角形、縞模様、対称、エルミート、スパース行列用のテンプレート化されたC++クラスを提供します。ベクトルと行列へのビューは、範囲、スライス、アダプタークラス、および間接配列を介して構築できます。このライブラリは、ベクトルと行列に対する通常の基本的な線形代数演算をカバーしています。さまざまなノルムのような縮小、ベクトルと行列の加算と減算、ベクトルのスカラー、内部および外部積、行列ベクトルと行列行列の積、三角ソルバーとの乗算です。

.。

  • エイゲン:

小さな固定サイズの行列から任意の大きな密な行列、さらには疎な行列まで、すべての行列サイズをサポートします。

Std :: complex、整数を含むすべての標準数値タイプをサポートし、カスタム数値タイプに簡単に拡張できます。

さまざまな行列分解とジオメトリ機能をサポートします。

サポートされていないモジュールのエコシステムは、非線形最適化、行列関数、多項式ソルバー、FFTなどの多くの特殊な機能を提供します。

.。

誰かが彼らの主な違いについてより良い考えを持っていますか、そしてそれらの間でどの基準で選ぶことができますか?

16
Vtik

私は実質的なプロジェクトをboost :: uBLASからEigenに書き直しています。これは、商用環境での本番コードです。 2006年にuBLASを選択したのは私で、現在はEigenへの変更を推奨しています。

uBLASでは、コンパイラによって実行される実際のベクトル化はほとんど発生しません。フロート型を使用して、SSEでAMD64アーキテクチャにコンパイルされた大きなソースファイルのアセンブリ出力を見ることができますが、単一の*** ps命令(addps、mulps、subps、4ウェイパック単精度浮動小数点)が見つかりません命令)および*** ss命令のみ(adds、...、スカラー単精度)。

Eigenを使用すると、ベクトル命令が確実に生成されるようにライブラリが作成されます。

Eigenは非常に完全な機能です。行列の因数分解とソルバーがたくさんあります。 boost :: uBLASでは、LU因数分解は文書化されていないアドオンであり、提供されたコードの一部です。Eigenには、uBLASではなく、回転やクォータニオンなどの3Dジオメトリが追加されています。

uBLASは、最も基本的な操作についてもう少し完全です。 Eigenには、射影(別の行列を使用して行列にインデックスを付ける)などのいくつかの機能がありませんが、uBLASにはあります。両方にある機能の場合、Eigenはより簡潔であるため、式が読みやすくなります。

次に、uBLASは完全に古くなっています。 2016/2017年に誰もがそれをどのように考えているのか理解できません。 FAQを読む:

Q:新しいプロジェクトにuBLASを使用する必要がありますか? A:執筆時点(2012年9月)では、MTL4、アルマジロ、固有値など、優れたマトリックスライブラリが多数利用可能です。 uBLASは、安定した、十分にテストされたベクトルクラスと行列クラスのセット、線形代数の一般的な演算、および三角連立方程式のソルバーを提供します。 uBLASは、すべて同様のインターフェイスを使用して、密で構造化されたスパース行列を提供します。そして最後に、uBLASは優れた(しかし卓越したものではない)パフォーマンスを提供します。一方、uBLASの最後の大きな改善は2008年であり、2009年以降、大きな変更は行われていません。したがって、決定を支援するためにいくつかの質問を自問する必要があります。 uBLASはブーストの一部であるため、多くの環境で利用できます。使いやすい? uBLASは単純なことには簡単に使用できますが、パスを離れるときはC++に関する適切な知識が必要です。パフォーマンス?より高速な代替手段があります。最先端? uBLASは10年以上前のものであり、C++ 11のすべての新しいものを見逃していました。

6
migle

かなり些細な行列計算のために、ブーストと固有値の時間計算量を比較しました。これらの結果は、限られたものですが、ブーストがはるかに優れた代替手段であることを示しているようです。前処理部分(要素マトリックスを設定してそれらをつなぎ合わせる)を実行するFEMコードがありました。したがって、当然、これには多くのメモリ割り当てが含まれます。

enter image description here

私はC++(gcc 5.4.0、ubuntu 16.04、Intel i3 Quad Core、2.40GHz、RAM:4Gb))でBoostとEigenを使用して同一のコードを記述し、さまざまなノードサイズに対して別々に実行しました。 (N)およびlinux cl-utilityを使用して計算された時間。私に関する限り、Boostでコードを続行することにしました。

4

式テンプレートによってもたらされるパフォーマンスとパフォーマンスの向上を気にする場合はEigenを選択し、式テンプレートのみを学習する場合はuBlasを選択します。

http://eigen.tuxfamily.org/index.php?title=Benchmark

2
kangshiyin