背景 数値プログラミングの登場により、高度なサブルーチンライブラリが有用になりました。これらのライブラリには、根の探索、行列の逆行列、連立方程式の解法など、一般的な高レベルの数学演算のためのサブルーチンが含まれます。選択された言語はFORTRAN でした。最も有名な数値プログラミングライブラリは、IBM のScientific Subroutine Package (SSP)でした。[ 13 ] これらのサブルーチンライブラリにより、プログラマは特定の問題に集中し、よく知られたアルゴリズムを再実装する必要がなくなりました。ライブラリルーチンは平均的な実装よりも優れており、たとえば、行列アルゴリズムでは、より高い数値精度を得るためにフルピボットを使用する場合があります。ライブラリルーチンには、より効率的なルーチンも含まれています。たとえば、ライブラリには、上三角行列を解くプログラムが含まれている場合があります。ライブラリには、一部のアルゴリズムの単精度バージョンと倍精度バージョンが含まれています。
当初、これらのサブルーチンは、低レベルの操作にハードコードされたループを使用していました。たとえば、サブルーチンが行列の乗算を実行する必要がある場合は、サブルーチンに 3 つのネストされたループが含まれます。線形代数プログラムには、多くの共通の低レベル操作 (いわゆる「カーネル」操作、オペレーティングシステム とは関係ありません) があります。[ 14 ] 1973 年から 1977 年の間に、これらのカーネル操作のいくつかが特定されました。[ 16 ] これらのカーネル操作は、数学ライブラリが呼び出すことができる定義済みサブルーチンになりました。カーネル呼び出しには、ハードコードされたループよりも利点がありました。ライブラリルーチンの可読性が向上し、バグの可能性が減り、カーネル実装を速度用に最適化することができました。スカラー とベクトル を使用したこれらのカーネル演算の仕様であるレベル1基本線形代数サブルーチン(BLAS)は1979年に公開されました。 BLASは線形代数サブルーチンライブラリLINPACK の実装に使用されました。
BLASの抽象化により、高性能化のためのカスタマイズが可能になります。例えば、LINPACKは汎用ライブラリであり、多くの異なるマシンで変更なしで使用できます。LINPACKは汎用バージョンのBLASを使用できます。パフォーマンスを向上させるために、異なるマシンでは、カスタマイズされたバージョンのBLASを使用する場合があります。コンピュータアーキテクチャが高度化するにつれて、ベクトルマシン が登場しました。ベクトルマシン用のBLASは、マシンの高速なベクトル演算を利用できます。(ベクトルプロセッサは最終的に廃れましたが、現代のCPUのベクトル命令は、BLASルーチンで最適なパフォーマンスを実現するために不可欠です。)
他のマシン機能も利用可能になり、活用できるようになりました。その結果、1984年から1986年にかけて、BLASはベクトル行列演算に関するレベル2カーネル演算で拡張されました。メモリ階層も活用できるものとして認識されました。多くのコンピュータはメインメモリよりもはるかに高速なキャッシュメモリ を備えています。行列操作を局所化することで、キャッシュをより効率的に使用できます。1987年と1988年には、行列-行列演算を行うレベル3 BLASが特定されました。レベル3 BLASはブロック分割アルゴリズムを推奨しました。LAPACKライ ブラリはレベル3 BLASを使用しています。
オリジナルのBLASは、密に格納されたベクトルと行列のみを対象としていました。疎行列など、BLASのさらなる拡張が検討されています。
機能性 BLAS の機能は、「レベル」と呼ばれる 3 つのルーチンセットに分類され、これは定義と公開の時系列順と、アルゴリズムの複雑さの多項式の次数に対応しています。レベル 1 の BLAS 操作は通常、線形時間 O ( n ) を要し、レベル 2 の操作は 2 次時間、レベル 3 の操作は 3 次時間です。[ 20 ] 最新の BLAS 実装は通常、3 つのレベルすべてを提供します。
レベル1 このレベルは、BLAS のオリジナルプレゼンテーション (1979) [ 1 ] で説明されているすべてのルーチンで構成されており、ストライド付き配列 に対するベクトル演算 (ドット積 、ベクトルノルム 、次の形式の一般化されたベクトル加算)のみが定義されています。
y ← α x + y {\displaystyle {\boldsymbol {y}}\leftarrow \alpha {\boldsymbol {x}}+{\boldsymbol {y}}} (「axpy」、「ax + y」と呼ばれる)およびその他のいくつかの演算。
レベル2 このレベルには、行列とベクトルの演算 が含まれており、その中には、一般 化された行列と ベクトルの 乗算(gemv)も含まれています。
y ← α A x + β y {\displaystyle {\boldsymbol {y}}\leftarrow \alpha {\boldsymbol {A}}{\boldsymbol {x}}+\beta {\boldsymbol {y}}} 線形方程式におけるx の解法も含む
T x = y {\displaystyle {\boldsymbol {T}}{\boldsymbol {x}}={\boldsymbol {y}}} T は三角形である。レベル 2 BLAS の設計は 1984 年に開始され、結果は 1988 年に発表された。[ 21 ] レベル 2 サブルーチンは、特にベクトルプロセッサ 上で BLAS を使用するプログラムのパフォーマンスを向上させることを目的としており、レベル 1 BLAS は「演算の行列ベクトルの性質をコンパイラから隠蔽するため」最適ではない。[ 21 ]
レベル3 1990年に正式に発表されたこのレベル[ 20 ] には、行列演算 が含まれており、その中には「一般行列乗算 」(gemm)の形式も含まれている。
C ← α A B + β C 、 {\displaystyle {\boldsymbol {C}}\leftarrow \alpha {\boldsymbol {A}}{\boldsymbol {B}}+\beta {\boldsymbol {C}},} ここで、A とBは ルーチン内で任意に転置 またはエルミート共役変換 することができ、3つの行列すべてにストライドを適用できます。通常の行列乗算ABは 、 αを 1に設定し、Cを 適切なサイズのすべてゼロの行列に設定することで実行できます。
レベル3には、計算ルーチンも含まれています。
B ← α T − 1 B 、 {\displaystyle {\boldsymbol {B}}\leftarrow \alpha {\boldsymbol {T}}^{-1}{\boldsymbol {B}},} ここで、T は三角行列 であり、その他にも様々な機能を持つ。
行列乗算は、レベル 3 BLAS の残りの実装を含め、多くの科学的アプリケーションで広く使用されているため、[ 22 ] また、行列とベクトルの乗算の明らかな繰り返しを超えてより高速なアルゴリズムが存在するため、gemmBLAS 実装者にとって最適化の主要なターゲットとなっています。たとえば、A とB のいずれか一方または両方をブロック行列 に分解することで、再帰的に実装 gemmできます。これは、 β パラメータを含める動機の 1 つです。これにより、前のブロックの結果を蓄積できます。この分解には、多くの実装で最適化されているβ = 1という特殊なケースが必要であることに注意してください。これにより、 C の各値に対して 1 つの乗算が削除されます。この分解により、積で使用されるデータの空間と時間の両方で参照の局所性 が向上します。これにより、システムのキャッシュが活用されます。 [ 23 ] 複数のレベルのキャッシュを備えたシステムでは、ブロックが計算で使用される順序に、ブロッキングを 2 回適用できます。これらの最適化レベルはどちらも、ATLAS などの実装で使用されています。最近では、後藤和成氏による実装で、 L2キャッシュ のみをブロッキングし、TLB ミスを減らすために連続メモリへのコピーを慎重に償却すること で、ATLAS よりも優れていることが示されています。[ 24 ] これらのアイデアに基づいた高度に調整された実装は、 GotoBLAS 、OpenBLAS 、BLIS の一部です。
の一般的なバリエーションはgemmでありgemm3m、これは「従来の 4 つの実数行列乗算と 2 つの実数行列加算の代わりに、3 つの実数行列乗算と 5 つの実数行列加算」を使用して複素積を計算するもので、ピーター・ウンガーによって最初に記述されたStrassen アルゴリズムに似たアルゴリズムです。 [ 25 ]
バッチ処理されたBLAS 従来の BLAS 関数は、 GPU などの大規模な並列処理をサポートするアーキテクチャにも移植されています。ここでは、従来の BLAS 関数は、通常、大きな行列に対して良好なパフォーマンスを提供します。しかし、GEMM ルーチンを使用して多数の小さな行列の行列積を計算する場合、これらのアーキテクチャではパフォーマンスが大幅に低下します。この問題を解決するために、2017 年に BLAS 関数のバッチバージョンが規定されました。[ 53 ]
上記のGEMMルーチンを例にとると、バッチ処理版では、多数の行列に対して以下の計算を同時に実行します。
C [ k ] ← α A [ k ] B [ k ] + β C [ k ] ∀ k {\displaystyle {\boldsymbol {C}}[k]\leftarrow \alpha {\boldsymbol {A}}[k]{\boldsymbol {B}}[k]+\beta {\boldsymbol {C}}[k]\quad \forall k}
インデックスk {\displaystyle k} 角括弧は、その演算がすべての行列に対して実行されることを示します。k {\displaystyle k} スタック内。多くの場合、この操作はストライド付きバッチメモリレイアウトに対して実装され、すべての行列が配列内で連結されます。A {\displaystyle A} 、B {\displaystyle B} そしてC {\displaystyle C} 。
バッチ処理された BLAS 関数は汎用性の高いツールであり、たとえば、多くの時間ステップを持つ長い積分期間を扱う指数積分器 やMagnus 積分器の高速実装を可能にします。 [ 54 ] ここでは、積分の計算コスト が高い部分である行列の指数化を、バッチ処理された BLAS 関数を使用することで、すべての時間ステップに対して並列に実装できます。
参考文献 1 2 3 Lawson , CL; Hanson, RJ; Kincaid, D.; Krogh, FT (1979). "FORTRANで使用するための基本的な線形代数サブプログラム". ACM Trans. Math. Softw . 5 (3): 308–323 . doi : 10.1145/355841.355847 . hdl : 2060/19780018835 . S2CID 6585321. Algorithm 539. ↑ 「BLASテクニカルフォーラム」 .netlib.org . 2017年7月7日 取得 。 ↑ blaseman 2016年10月12日にWayback Machine に アーカイブ済み「これらの製品は、パブリックドメインのBLAS(Basic Linear Algebra Subprograms)とLAPACK(Linear Algebra PACKage)の実装であり、米国テネシー大学のジャック・ドンガラ教授などのグループによって開発され、すべてWWW(URL:https: //www.netlib.org/ )で公開されています。」 ↑ Jack Dongarra; Gene Golub; Eric Grosse; Cleve Moler; Keith Moore. "Netlib と NA-Net: 科学計算コミュニティの構築" (PDF) . netlib.org . 2016-02-13 に取得 。Netlib ソフトウェアリポジトリは、科学計算で使用するためのパブリックドメインのソフトウェアルーチンを迅速に配布するために 1984 年に作成されました。 1 2 「Arm Performance Libraries」 . Arm . 2020. 2020年12月16日 取得 。 ↑ 「BLASライブラリ」 。 1 2 「Intel Math Kernel Library (MKL) の無償オプション、サポート、ロイヤリティフリー」 . Intel . 2015 . 2015-08-31 に取得. ↑ 「Intel Math Kernel Library (Intel MKL)」 . Intel . 2015. 2015年8月25日 取得 。 ↑ 「最適化に関する通知」 . Intel . 2012. 2013年4月10日 取得 。 ↑ Douglas Quinney (2003). 「Mathematica 5.0 の新機能とは?」 (PDF) . MSOR Connections . 3 (4). The Higher Education Academy. 2013年10月29日に オリジナル (PDF) からアーカイブ済み。 ↑ Cleve Moler (2000). "MATLAB Incorporates LAPACK" . MathWorks . 2013年10月26日 取得 . ↑ Stéfan van der Walt; S. Chris Colbert & Gaël Varoquaux (2011). "NumPy配列: 効率的な数値計算のための構造". Computing in Science and Engineering . 13 (2): 22–30 . arXiv : 1102.1523 . Bibcode : 2011CSE....13b..22V . doi : 10.1109/MCSE.2011.37 . S2CID 16907816 . ↑ Boisvert, Ronald F. (2000). "Mathematical software: past, present, and future". Mathematics and Computers in Simulation . 54 ( 4–5 ): 227–241 . arXiv : cs/0004004 . Bibcode : 2000cs........4004B . doi : 10.1016/S0378-4754(00)00185-3 . S2CID 15157725 . ↑ 1966年頃に登場したSSPにも、RADD(行の追加)、CADD(列の追加)、SRMA(行のスケーリングと別の行への追加)、RINT(行の交換)などの基本的なルーチンがいくつか含まれていました。これらのルーチンは、行列の逆行列計算などの他のルーチンを実装するためのカーネル操作としては使用されていなかったようです。IBM(1970)、 『 System/360 Scientific Subroutine Package、バージョンIII、プログラマーズマニュアル (第5 版)』、International Business Machines、GH20-0205-4を参照してください。 。 ↑ Hanson, RJ; Krogh, FT; Lawson, CL (1973-10-01). "線形代数用ポータブルソフトウェアの効率改善" . ACM SIGNUM Newsletter . 8 (4): 16. doi : 10.1145/1052646.1052653 . 2026-02-06 に取得. 1 2 Dongarra, Jack J.; Du Croz, Jeremy; Hammarling, Sven; Duff, Iain S. (1990). "レベル 3 の基本線形代数サブルーチンのセット" . ACM Transactions on Mathematical Software . 16 (1): 1– 17. doi : 10.1145/77626.79170 . ISSN 0098-3500 . S2CID 52873593 . 1 2 Dongarra, Jack J.; Du Croz, Jeremy; Hammarling, Sven; Hanson, Richard J. (1988). "拡張された FORTRAN 基本線形代数サブルーチンセット". ACM Trans. Math. Softw . 14 : 1– 17. CiteSeerX 10.1.1.17.5421 . doi : 10.1145/42288.42291 . S2CID 3579623 . ↑ 後藤和重 、 ロバート A. van de Geijn (2008). "レベル 3 BLAS の高性能実装" (PDF) . ACM Transactions on Mathematical Software . 35 (1): 1– 14. doi : 10.1145/1377603.1377607 . S2CID 14722514 . 2017-07-06 に オリジナル (PDF) からアーカイブ済み 。 ↑ Golub, Gene H. ; Van Loan, Charles F. (1996), Matrix Computations (3rd ed.), Johns Hopkins, ISBN 978-0-8018-5414-9 ↑ 後藤和重 、 ロバート A. van de Geijn ( 2008)。 「 高性能行列乗算の構造」。ACM Transactions on Mathematical Software。34 (3): 12 : 1–12:25。CiteSeerX 10.1.1.111.3873。doi : 10.1145 / 1356052.1356053。ISSN 0098-3500。S2CID 9359223 。 (25ページ)↑ Van Zee, Field G.; Smith, Tyler M. (2017-07-24). "3m および 4m メソッドによる高性能複素行列乗算の実装". ACM Transactions on Mathematical Software . 44 (1): 1– 36. doi : 10.1145/3086466 . S2CID 25580883 . ↑ 「ガイドとサンプルコード」 。developer.apple.com 。 2017 年7月7日 取得 。 ↑ 「ガイドとサンプルコード」 。developer.apple.com 。 2017 年7月7日 取得 。 ↑ 「自動調整線形代数ソフトウェア(ATLAS)」 . math-atlas.sourceforge.net . 2017年7月7日 取得 。 ↑ blis: BLASライクなライブラリインスタンス化ソフトウェアフレームワーク 、flame、2017年6月30日、 2017年7月7日 取得 ↑ BLIS GitHubリポジトリ 、2021年10月15日 ↑ "C++ AMP BLASライブラリ" . CodePlex . 2017年7月8日に オリジナルからアーカイブ済み . 2017年7月7日 に取得. ↑ "cuBLAS" . NVIDIA Developer . 2013-07-29 . 2017-07-07 に取得. ↑ "NVBLAS" . NVIDIA Developer . 2018-05-15 . 2018-05-15 に取得 . ↑ clBLAS: OpenCLで記述されたBLAS関数を含むソフトウェアライブラリ 、clMathLibraries、2017年7月3日、 2017年7月7日 取得 ↑ Nugteren、Cedric (2017-07-05)、 CLBlast: Tuned OpenCL BLAS 、 2017-07-07 取得 ↑ IBMナレッジセンター:エンジニアリングおよび科学サブルーチンライブラリ ↑ ミルフェルド、ケント。 「GotoBLAS2」 。 テキサス先端コンピューティングセンター 。 2020年3月23日の オリジナルからアーカイブ済み。 2024年3月17日 取得 。 ↑ 「Intel Math Kernel Library (Intel MKL) | Intel Software」 。software.intel.com 。 2017年7月7日 取得 。 ↑ Mathkeisan, NEC. "MathKeisan" . www.mathkeisan.com . 2017年7月7日 取得 . ↑ 「BLAS(基本線形代数サブプログラム)」 。 www.netlib.org 。 2017年7月7日 取得 。 ↑ 「BLAS(基本線形代数サブプログラム)」 。 www.netlib.org 。 2017年7月7日 取得 。 ↑ 「OpenBLAS: 最適化されたBLASライブラリ」 。www.openblas.net 。 2017年7月7 日 取得 。 ↑ 「PDLIB/SX: ビジネスソリューション | NEC」 。 2007年2月22日に オリジナルからアーカイブ済み 。 2007年5月20日 に取得。 ↑ "rocBLAS" . rocmdocs.amd.com . 2021年5月22日に オリジナルからアーカイブ済み . 2021年5月21日 に取得. ↑ 「SGI - SCSL 科学図書館: ホームページ」 。 2007年5月13日に オリジナルからアーカイブ済み 。 2007年5月20日 に取得。 ↑ 「Oracle Developer Studio」 。www.oracle.com 。 2017年7月7日 取得 。 ↑ "Boost Basic Linear Algebra - 1.60.0" . www.boost.org . 2017年7月7日 取得 . ↑ "Armadillo: C++ 線形代数ライブラリ" . arma.sourceforge.net . 2017-07-07 に取得. ↑ "Dlang 数値計算およびシステムライブラリ" . GitHub . ↑ "Elemental: 分散メモリの密および疎な直接線形代数と最適化 — Elemental" . libelemental.org . 2013年8月1日のオリジナルからアーカイブ済み。 2017年7月7日 取得 。 ↑ "HASEM" . SourceForge . 2015-08-17 . 2017-07-07 に取得. ↑ Duff, Iain S.; Heroux, Michael A.; Pozo, Roldan (2002). "An Overview of the Sparse Basic Linear Algebra Subprograms: The New Standard from the BLAS Technical Forum". ACM Transactions on Mathematical Software . 28 (2): 239–267 . doi : 10.1145/567806.567810 . S2CID 9411006 . ↑ Dongarra, Jack; Hammarling, Sven; Higham, Nicholas J.; Relton, Samuel D.; Valero-Lara, Pedro; Zounon, Mawussi (2017). "The Design and Performance of Batched BLAS on Modern High-Performance Computing Systems" . Procedia Computer Science . 108 : 495–504 . doi : 10.1016/j.procs.2017.05.138 . hdl : 2117/106913 . ↑ Herb, Konstantin; Welter, Pol (2022). "バッチBLAS (基本線形代数サブルーチン) ルーチンを使用した並列時間積分". Computer Physics Communications . 270 108181. arXiv : 2108.07126 . Bibcode : 2022CoPhC.27008181H . doi : 10.1016/j.cpc.2021.108181 . S2CID 237091802 .
さらに読む BLASTフォーラム(2001年8月21日)、基本線形代数サブプログラム技術(BLAST)フォーラム標準 、テネシー州ノックスビル:テネシー大学 Dodson, DS; Grimes, RG (1982)、「アルゴリズム539に関する考察:Fortranで使用するための基本的な線形代数サブルーチン」、ACM Trans. Math. Softw. 、8 (4): 403–404 、doi : 10.1145/356012.356020、S2CID 43081631 Dodson, DS (1983)、「訂正:『アルゴリズム539:FORTRANで使用するための基本的な線形代数サブルーチン』に関する注記」 「、ACM Trans. Math. Softw. 、9 :140、doi :10.1145/356022.356032 、S2CID 22163977 JJ Dongarra、J. Du Croz、S. Hammarling、RJ Hanson、「アルゴリズム 656: FORTRAN 基本線形代数サブプログラムの拡張セット」、ACM Trans. Math. Softw.、14 (1988)、pp. 18 – 32。 JJ Dongarra、J. Du Croz、IS Duff、S. Hammarling、「レベル3の基本線形代数サブプログラムのセット」、ACM Trans. Math. Softw.、16 (1990)、pp. 1 – 17。 JJ Dongarra、J. Du Croz、IS Duff、S. Hammarling、「アルゴリズム679:レベル3の基本線形代数サブルーチンのセット」、ACM Trans. Math. Softw.、16(1990)、pp. 18 – 28。 新しいBLAS LS Blackford、J. Demmel、J. Dongarra、I. Duff、S. Hammarling、G. Henry、M. Heroux、L. Kaufman、A. Lumsdaine、A. Petitet、R. Pozo、K. Remington、RC Whaley、「基本線形代数サブプログラムの更新セット(BLAS)」、ACM Trans. Math. Softw.、28-2(2002)、pp. 135 – 151。 J. Dongarra、「基本線形代数サブプログラム技術フォーラム標準」、International Journal of High Performance Applications and Supercomputing、16(1) (2002)、pp. 1 – 111、およびInternational Journal of High Performance Applications and Supercomputing、16(2) (2002)、pp. 115 – 199。
外部リンク Netlib.orgのBLASホームページ BLASに関するよくある質問 BLASクイックリファレンスガイド(LAPACKユーザーガイドより) ローソン氏による口述歴史BLASの原著者の1人が、口述歴史インタビューでその作成について語る。チャールズ・L・ローソン氏への口述歴史インタビュー、トーマス・ヘイグ氏による、2004年11月6日および7日、カリフォルニア州サンクレメンテ。産業応用数学会、ペンシルベニア州フィラデルフィア。 ドンガラ氏のオーラルヒストリーインタビュー ジャック・ドンガラ氏は、オーラルヒストリーインタビューの中で、BLASとLINPACKの初期の関係、新しいアーキテクチャ向けの高レベルBLASバージョンの作成、そして特定のマシン向けにBLASを自動的に最適化するATLASシステムに関する後期の研究について語っています。ジャック・ドンガラ氏、トーマス・ヘイグ氏によるオーラルヒストリーインタビュー、2005年4月26日、テネシー大学ノックスビル校、テネシー州。産業応用数学会、フィラデルフィア、ペンシルベニア州 BLASはどのようにしてこれほどの驚異的なパフォーマンスを実現しているのでしょうか?単純な1000 × 1000行列の乗算(浮動小数点数の乗算加算を10回)を2.6GHzプロセッサで15.77秒で実行すると、 BLAS の実装ではわずか1.32 秒で済みます。 疎行列基本線形代数サブプログラムの概要:BLASテクニカルフォーラムによる新しい標準