商用利用 |
許可(制限なし)opensource.org |
許可(制限なし)eigen.tuxfamily.org |
個人利用 |
許可(制限なし)opensource.org |
許可(制限なし)eigen.tuxfamily.org |
表記義務 |
ソース/バイナリ再配布時に著作権表示と免責条項を含める必要があるopensource.org |
ライセンス文書を含める必要がある(各ファイルにSPDX識別子やヘッダを付与)mozilla.orgeigen.tuxfamily.org |
改変・再配布 |
許可(変更内容の開示義務なし)opensource.org |
許可。ただしEigenライブラリ自身のソースに修正を加えて再配布する場合、その修正部分をMPLで開示する必要があるmozilla.org |
ソース開示 |
必須ではない |
MPL対象ファイル(Eigenヘッダ)を配布する際に修正を開示mozilla.org |
責任明示(免責) |
「AS IS」「無保証」で提供。著作権者/貢献者は一切の責任を負わない(免責条項)opensource.org |
同様に無保証・免責(MPL条項に含まれる) |
その他 |
コントリビュータ名や開発者名を製品名や宣伝に使ってはならない(推奨・エンドースメント禁止)opensource.org |
ファイル単位の弱いコピーレフト。Eigen自体を改変しない限り、利用ソフトウェアのソース公開義務は課されないmozilla.orgeigen.tuxfamily.org
用途別の適合性
-
商用アプリ開発: どちらも商用で利用可能だが、ライセンス条項に注意が必要。OpenBLAS (BSD) はほとんど制限がなく、ソフトウェアへの組み込みや再配布が容易opensource.org。Eigen (MPL) も閉源アプリに使えるが、Eigen本体を改変した場合はその修正を公開する義務があるmozilla.orgeigen.tuxfamily.org。企業が「オープンソース依存」を避けたがる場合、BSDライセンスのほうが安心感が高いことがあるforum.kde.org。
-
研究開発: 研究用途ではどちらも問題なく使用できる。Eigenはヘッダのみのテンプレートライブラリで利用が簡便なため、試作やプロトタイプに使われることが多い。OpenBLASは最適化されたBLAS/LAPACK実装なので、大規模な数値計算で性能を重視する研究開発に適している。研究目的であればライセンス開示の影響は少ないため、実装しやすいほうを選んでよい。
-
再配布用ライブラリ開発: 自身でライブラリを配布する場合、OpenBLAS版はBSD条件(著作権表示の保持など)さえ守ればほぼ自由に組み込めるopensource.org。Eigen版の場合も、Eigenヘッダを同梱して配布できるが、配布時にはMPLライセンス表記を含める必要がある。Eigenヘッダを改変していなければ公開義務はないため、配布条件自体はそれほど厳しくはないmozilla.orgeigen.tuxfamily.org。つまりプロプライエタリな再配布ではOpenBLASの方がライセンス上の自由度が高く、Eigenは「改変分だけ開示で済む」弱いコピーレフトである。
性能比較
-
連立一次方程式 (Ax = b) の解法: OpenBLASはLAPACKを含み、DGESV などの最適化された解法ルーチンが利用可能で、大規模行列の解法性能は極めて高いnetlib.org。EigenはLU分解やQR分解による直接解法を提供するが、非常に大きな系ではLAPACKほど高速とは限らない。一般には、OpenBLAS+LAPACKのほうが大規模系には有利であり、非常に高速な解が期待できる。一方、系の規模や反復ソルバーの選択により差は変動する。参考までに、LAPACKベンチマークでは最適化BLAS(LinuxではATLAS)を用いて計測が行われておりnetlib.org、OpenBLAS版でも同等かそれ以上の性能が見込める。
-
行列演算 (特に行列積): 大規模行列積ではOpenBLASが優位であることが知られているblog.csdn.netblog.csdn.net。例えばあるベンチマーク(単一スレッド)では、行列サイズ1000でOpenBLASが0.2373秒、Eigenが0.3179秒(OpenBLASが約25%速い)という結果が得られたblog.csdn.net。行列サイズが増えるほど差は大きくなり、サイズ5000ではOpenBLASが29.07秒、Eigenが37.68秒とOpenBLASが高速だったblog.csdn.net。逆に小規模行列(数百サイズ以下)では、Eigenのテンプレート最適化によりMKL等を上回る例も報告されているdiscourse.julialang.org。複数コア利用時は、OpenBLASもEigenもマルチスレッド化できるが、一般にOpenBLASやMKLといったBLASライブラリを併用するほうが性能面で有利とされるscicomp.stackexchange.com。
-
共役勾配法 (CG): Eigenには疎行列(および密行列)向けの共役勾配ソルバーEigen::ConjugateGradient が用意されているeigen.tuxfamily.org。これにより自己随伴行列に対する反復解法が可能で、内部でベクトル演算を行う。OpenBLAS自体にはCGの高級APIはないため、CGを利用する場合はBLAS(axpyやdot)を用いた自前実装か、別ライブラリ(EigenやIntel MKLのスパース機能、PETScなど)を組み合わせることになる。性能面では、CGは前処理や疎行列の特性に大きく依存するため、ライブラリ選択以上にアルゴリズム設計が重要である。
-
内点法・線形計画法 (LP): いずれのライブラリも直接的な内点法ソルバーや線形計画ソルバーを含んでいない。これらを利用する場合はGLPKやCPLEX、Gurobi、OSQPなどの専用ソルバを用い、それらの内部でBLAS(OpenBLAS)やEigenの線形代数機能が使われることがある。従って純粋な比較対象外だが、Eigenの行列操作機能やOpenBLASの高速BLASは、独自実装の数値演算部分で有利に働く可能性がある。
-
配列の行・列の合計: 素朴なループ計算またはBLASのSDOT (全て1のベクトルとの内積)等で実装される簡単な操作であり、ライブラリ依存性は低い。一般にどちらもメモリアクセス速度にほぼ左右され、大きな性能差はない。Eigenでは.rowwise().sum() などの組み込み関数、OpenBLASでは低レベルのループもしくはBLAS関数で実装可能である。
-
配列のコピー: 完全にメモリ転送の処理であり、memcpy 程度の違いしかないため、EigenもOpenBLASも同等である。ライブラリ固有の最適化は特にないため、どちらを使ってもほぼ差が生じない。
参考: 行列演算のベンチマーク結果blog.csdn.netdiscourse.julialang.org、Eigen公式ドキュメントeigen.tuxfamily.org、また実際のユーザ議論scicomp.stackexchange.comdiscourse.julialang.orgなどを基にまとめた。OpenBLASはGotoBLAS2系のチューニングによってピーク性能に近づいており、特に大規模行列では優れるblog.csdn.net。一方Eigenはテンプレート式評価による組み合わせ最適化が強みで、条件によっては高速になる場合があるdiscourse.julialang.orgscicomp.stackexchange.com。 |