OpenBLASとEigenについての考察

引用 ChatGPT

 

  1. ライセンス比較(商用利用、個人利用、ライブラリ作者の責任、ライセンス表記、変更・再配布、ソースコード公開義務など)

  2. 上記内容を踏まえた総合的な比較

  3. C++環境での代表的な数値計算(Ax=bの求解、行列演算、CG法、内点法、LP、配列操作)における速度差の比較やベンチマーク考察

調査が完了次第、比較表や明確な結論を含めてご報告します。

 

OpenBLASとEigenのライセンス比較

項目 OpenBLAS (BSD-3-Clause) Eigen (MPL 2.0)
商用利用 許可(制限なし)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-3-Clauseで、商用・個人利用ともにほぼ制限なく自由に使えるopensource.org。EigenはMPL v2.0でこちらも商用・個人利用が認められており、閉源ソフトでもEigenを組み込んで配布できる(自社コードの開示義務はない)eigen.tuxfamily.org

  • 表記義務: OpenBLASではソース・バイナリの再配布時にライセンス文を付記すればよくopensource.org、Eigenでも配布パッケージにMPLライセンス文を含める必要があるmozilla.orgeigen.tuxfamily.org

  • 改変時の義務: BSDでは改変したコードを公開する義務はなく自由度が高いopensource.org。対してMPLでは、Eigenヘッダ(ライセンス対象ファイル)に加えた変更はMPLの下で開示しなければならない(ライセンス部分の再公開義務)mozilla.org。ただし新規に自作したファイルやEigenに依存しない部分には公開義務は及ばないmozilla.org

  • 責任・保証: いずれも無保証(“AS IS”)を明記し、著作権者・開発者は責任を負わない旨が定められているopensource.org

  • 注意点: MPLはBSD/MITよりファイル単位でコピーレフト性があるため、企業によってはLGPL/GPLと混同して警戒される場合があるforum.kde.org。OpenBLAS/BSDは更に緩やかで、企業開発ではBSDの方を好むケースもあるforum.kde.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

    行列サイズ Eigen (単一スレッド) OpenBLAS (単一スレッド)
    1000×1000 0.3179 秒 0.2373 秒 blog.csdn.net
    3000×3000 8.2807 秒 6.2979 秒 blog.csdn.net
    5000×5000 37.6755 秒 29.0723 秒 blog.csdn.net
    上記はCSDNブログのベンチマーク結果(単一スレッド)より。OpenBLASが一貫して高速であることがわかるblog.csdn.net    
  • 共役勾配法 (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