2.5K Views
May 12, 25
スライド概要
第5回 5 月 15 日 GPUコンピューティングと大規模学習への展開
プログラム高速化の基礎知識、並列化プログラミング(MPI、OpenMP)の基礎知識、およびプログラム高速化の応用事例の座学を通して、計算科学で必要な高性能計算技術の基礎の習得を目指す。
R-CCS 計算科学研究推進室
内容に関する質問は [email protected] まで 第5回 GPUコンピューティングと 大規模学習への展開 名古屋大学情報基盤センター 片桐孝洋 1 2025年度 計算科学技術特論A
講義日程と内容について 2025年度 計算科学技術特論A(木曜:13:00-14:30 ) 第1回:プログラム高速化の基 礎、2025年4月10日 イントロダクション、ループアンローリング、キャッシュブロック化、 数値計算ライブラリの利用、その他 第2回:MPIの基礎、2025年4月17日 並列処理の基礎、MPIインターフェース、MPI通信の種類、その他 第3回:OpenMPの基礎、2025年4月24日 OpenMPの基礎、利用方法、その他 第4回:Hybrid 並列化技法(MPI 、OpenMP応用とOpenACC)、2025年5月8日 背景、Hybrid並列化の適用事例、利用上の注意、その他 第5回:GPUコンピューティングと大規模学習への展開、2025年5月15日 プログラムの性能ボトルネック に関する考えかた(I/O、単体性能 (演算機ネック、メモリネック)、並列性能(バランス))、性能プロファイル、 機械学習におけるHPC、「富岳NEXT」とGPUコンピューティング、ほか 2 2025年度 計算科学技術特論A
性能チューニングの応用 3 2025年度 計算科学技術特論A
性能チューニングに関する総論(その1) コンパイラを過信しない 書き方が悪いと、自動並列化だけでなく、 逐次最適化もできない! 1ループ中で書いてある<式>がとても多い時 レジスタが足りなくなって、メモリにデータを 吐き出すコードを生成するので、性能低下する 加えて、式が複雑で、コンパイラの解析ができない 要因が増える ⇒後述の、手による「ループ分割」が必要になる 4 2025年度 計算科学技術特論A
性能チューニングに関する総論(その2) コンパイラを過信しない(つづき) 自動並列化は<特に>過信しない ループ並列性がない逐次コードは並列化できない 書き方が悪いと、原理的に並列化できるループも、 自動並列化できない ループの構造(開始値、終了値が明確か、など) 言語的特徴から生じる問題もある C言語では、並列化したいループがある関数コール時の 引数にデータ依存があると判断されると、並列化できない。 自動並列化コンパイラ != 逐次コードを自動で並列コードに書き直すコンパイラ 5 2025年度 計算科学技術特論A
性能チューニングに関する総論(その2) コンパイラを過信しない(つづき) 例)foo (A, B, C); ←一般にA、B、Cは同一配列 で引渡される可能性があるため、A、B、C間は 依存があると仮定 →並列化できない ⇒ディレクティブ、コンパイラオプション指定で対応 int foo(double A[N][N], double B[N][N], double C[N][N]) { int i, j, k; for (i=0; i<N; i++) { for (j=0; j<N; j++) { for (k=0; k<N; k++) { C[i][j] += A[i][k] * B[k][j]; } } } } 6 2025年度 計算科学技術特論A
性能チューニングに関する総論(その3) コンパイラを過信しない(つづき) スレッド数の増加 低スレッド並列(2~4スレッド)向きのコードと、高スレッド並列 (16スレッドを超える)向きコードは、まったく異なる コンパイラは、実行前にユーザが使うスレッド数を 知ることが出来ない 平均的なスレッド数を仮定、まあまあな 性能のコードを生成する 並列数が増加すると、ループ長が短くなることで、 ループ並列性が無くなる ⇒後述の、手による「ループ融合」が必要になる 7 2025年度 計算科学技術特論A
性能チューニングに関する総論(その4) コンパイラを過信しない(つづき) あるベンダ提供のコンパイラで最適化できたとしても、 別のベンダ提供のコンパイラで最適化できる保証はない 例)富士通Fortranコンパイラ と インテルFortranコンパイラ 同一ベンダのコンパイラでも新規ハードでは、 同一コードでも同じ品質で最適化できる保証がない 従来からあるコード(レガシーコード)で、ハードウェア、および、 ソフトウェア環境が変わっても、高い性能を保つこと(性能可搬性)は、 HPC分野でホットな研究テーマ 「ソフトウェア自動チューニング」の研究分野 ソフトウェア性能工学 (Software Performance Engineering, SPE) ソフトウェア開発コストを低く保つ、チューニングの枠組み コード自動生成技術 性能モデリング、パラメタ最適化、機械学習、等の技術が必要 8 2025年度 計算科学技術特論A
性能チューニングに関する総論(その5) 自分のコードのホットスポット(重い部分)を 認識せよ 自分のコードのうち、どの部分が重いのか、 実測により確認せよ 1. 演算時間ボトルネック(演算時間が多い) 2. 通信時間ボトルネック(通信時間が多い) 3. I/Oボトルネック(I/O時間が多い) 9 2025年度 計算科学技術特論A
性能チューニングに関する総論(その6) 自分のコードのホットスポット(重い部分)を認識せよ 計算量など、机上評価はあてにならない 実性能は計算機環境や実行条件に依存 思わぬところに ホットスポット(重い部分) あり チューニング状況に応じホットスポットは変わる 計算量が多くても、問題サイズが小さく、キャッシュに のる場合は、演算時間が占める割合は少ない (かもしれない) 通信量が少なくても、通信<回数>が多いと、 通信レイテンシ律速 I/O量が少なくても、I/Oハードウェアが貧弱、 実行時に偶発的にI/O性能が劣化すると、I/O律速 10 2025年度 計算科学技術特論A
状況に応じて変化していくホットスポット 最初は演算律速 演算時間 通信時間 I/O 時 間 演算チューニングをすると、次は通信律速に 演算 時間 11 通信時間 I/O 時 間 2025年度 計算科学技術特論A
ホットスポット判明後の最適化方針の一例 演算ボトルネックの場合(順番は検討する優先度) コンパイラオプションの変更 1. プリフェッチ、ソフトウェア・パイプライニング強化オプション、など アンローリング、タイリング(ブロック化)のディレクティブ追加、など アルゴリズムを変更し、計算量が少ないものを採用 アルゴリズムを変更し、キャッシュ最適化向きのもの を採用 2. 3. 「ブロック化アルゴリズム」の採用 コンパイラが自動で行わないコードチューニングを 手で行う 4. 12 アンローリング、ループ分割、ループ融合、など 高速化(連続アクセス)に向くデータ構造を採用 2025年度 計算科学技術特論A
ホットスポット判明後の最適化方針の一例 通信ボトルネックの場合 通信レイテンシが主要因(通信回数が多い) こま切れの通信をまとめて送る (通信のベクトル化) 2. 冗長計算による通信回数の削減 3. 非同期通信による通信の隠ぺい 通信量が主要因(1回当たり通信データが多い) 1. 冗長計算による通信量の削減 2. より高速な通信実装方式の採用 (Remote Direct Memory Access (RDMA) など) 3. 非同期通信による通信の隠ぺい 1. 13 2025年度 計算科学技術特論A
ホットスポット判明後の最適化方針の一例 I/Oボトルネックの場合 「富岳」では、最多で1ノード48MPIプロセスが走る ピュアMPIで、1MPIあたり1つファイルアクセス をすると、IO性能が極端に劣化する →1ノード当たり30MPIプロセス以下にする 高速なファイルシステムを使う ファイルステージングの利用 高速ファイルシステム(SSD、バーストバッファなど)の利用 2. データを間引き、I/O量を削減する 3. OSシステムパラメタの変更 I/Oストライプサイズの変更 大規模データサイズを1回I/Oする場合は、ストライプサイズを大きくする 4. より高速なI/O方式を採用する ファイル書き出しは、MPIプロセスごとに別名を付け、同時にI/O出力する 実装であることが多い 高速なファイルI/O(Parallel I/O、MPI-IOなど)を使う 複数のファイルを1つに見せることができる ただしMPI-IO等が高性能でないと意味が無い 1. 14 2025年度 計算科学技術特論A
ホットスポットをどのようにして知るのか プログラム中にタイマを設定して調べる 2. 性能プロファイラを利用する 演算ボトルネック 1. プロファイラの基本機能により調査可能 ループごとの詳細プロファイルにより、ハードウェア性能 (キャッシュヒット率など)を調査可能 例)富士通 基本プロファイラ、など 通信ボトルネック プロファイラの基本機能により調査可能 例)富士通 基本プロファイラ、など I/Oボトルネック 一般にあまり提供されていない スパコンベンダによっては専用プロファイラを提供している 例)HPE(Cray)社のプロファイラ(CrayPat Performance Analysis Tool) 15 2025年度 計算科学技術特論A
その他の注意 I/Oを行うため、プロセス0にデータを集積し、 プロセス0のみがI/Oをするプログラム データ集積のために、MPI_AllgatherV関数などが使われる I/Oのための通信時間が占める割合が大きくなる ノード数が増えるほど、上記のI/O時間の割合は大きくなる ⇒超並列向きではない実装 I/Oは、プロセスごとに並列に行うほうが良い 16 ただし、プロセスごとに分散されて生成されるファイルの 扱いが問題になる できるだけ、MPI-IOや、その他のシステムソフトウェア提供の 機能を使い、プロセスごとにファイルを見せない実装がよい 2025年度 計算科学技術特論A
性能プロファイリング 17 2025年度 計算科学技術特論A
性能プロファイリングの重要性 プログラムにおいて、どの箇所(手続き(関数))に時間 がかかっているか調べないと、チューニングを行っても 効果がない 手続きA:100秒、手続きB:10秒、手続きC:1秒、全体:111秒 手続きAは全体時間の90%なので、これをチューニングすべき 性能プロファイルを行うには、一般的には、スパコン提供 メーカが提供しているプロファイラを使うとよい 多くは、コンパイラと連携している 1. 2. 3. 4. 18 コンパイラオプションで指定し、実行可能コードを生成 実行可能コードを実行 性能プロファイルのためのファイル(ログファイル)が作成される 専用のコマンドを実行する 2025年度 計算科学技術特論A
性能プロファイラでわかること 性能プロファイラツールに大きく依存 ノード内性能 全体実行時間に占める、各手続き(関数)の割合 MFLOPS(GFLOPS)値 キャッシュヒット率 スレッド並列化の効率(負荷バランス) I/O時間が占める割合 ノード間性能 MPIなどの通信パターン、通信量、通信回数 (多くは専用のGUIで見る) 19 2025年度 計算科学技術特論A
性能プロファイラ例 富士通コンパイラには、性能プロファイラ機能がある 富士通コンパイラでコンパイル後、実行コマンドで指定し 利用する 以下の2種類がある 基本プロファイラ 主な用途:プログラム全体で、最も時間のかかって いる関数を同定する 詳細プロファイラ 主な用途:最も時間のかかっている関数内の指定 部分において、メモリアクセス効率、キャッシュヒット率、 スレッド実行効率、MPI通信頻度解析、を行う 20 2025年度 計算科学技術特論A
性能プロファイラの種類の詳細 基本プロファイラ コマンド例:fipp –C 表示コマンド:fipppx、GUI(WEB経由) ユーザプログラムに対し一定間隔(デフォルト時100 ミリ秒間隔)毎に割り込み をかけ情報を収集する。 収集した情報を基に、コスト情報等の分析結果を表示。 詳細プロファイラ コマンド例:fapp –C 表示コマンド:GUI(WEB経由) ユーザプログラムの中に測定範囲を設定し、測定範囲のハードウェア カウンタの値を収集。 収集した情報を基に、MFLOPS、MIPS、各種命令比率、キャッシュミス等の 詳細な分析結果を表示。 21 2025年度 計算科学技術特論A
基本プロファイラ利用例 調べるべきプログラムのあるディレクトリに Profディレクトリを作成 $ mkdir Prof wa2(対象の実行可能ファイル) の wa2-pure.bash(スクリプト ファイル) 中に以下を記載 fipp -C -d Prof mpirun ./wa2 実行する $ pjsub wa2-pure.bash テキストプロファイラを起動 $ fipppx –A -d Prof 22 2025年度 計算科学技術特論A
基本プロファイラ出力例(1/2) -----------------------------------------------------------------------------------------Fujitsu Instant Profiler Version 1.2.0 Measured time : Thu Apr 19 09:32:18 2012 CPU frequency : Process Type of program : MPI 0- 127 1848 (MHz) Average at sampling interval : 100.0 (ms) Measured range : All ranges Virtual coordinate : (12, 0, 0) -----------------------------------------------------------------------------------------____________________________________________________________________________________ Time statistics Elapsed(s) User(s) System(s) --------------------------------------------2.1684 53.9800 87.0800 Application --------------------------------------------2.1684 0.5100 0.6400 Process 11 2.1588 0.4600 0.6800 Process 88 2.1580 0.5000 0.6400 Process 99 2.1568 0.6600 1.4200 Process 111 各MPIプロセスの 経過時間、ユーザ時間、システム時間 … 23 2025年度 計算科学技術特論A
基本プロファイラ出力例(2/2) __________________________________________________________________________________________ Procedures profile 各関数の実行時間が、 全体時間に占める割合 ************************************************************************************* Application - procedures ************************************************************************************* Cost % Mpi % Start End 具体的な箇所と、 ソースコード上の 行数の情報 ---------------------------------------------------------------------475 100.0000 312 65.6842 -- -- Application ---------------------------------------------------------------------312 65.6842 312 100.0000 1 45 MAIN__ 82 17.2632 0 0.0000 -- -- __GI___sched_yield 80 16.8421 0 0.0000 -- -- __libc_poll 1 0.2105 0 0.0000 -- -- __pthread_mutex_unlock_usercnt ************************************************************************************* Process 11 - procedures ************************************************************************************* Cost % Mpi % Start End ---------------------------------------------------------------------5 100.0000 4 80.0000 -- -- Process 11 ---------------------------------------------------------------------4 80.0000 4 100.0000 1 20.0000 0 0.0000 1 -- 45 MAIN__ -- __GI___sched_yeld …. 24 2025年度 計算科学技術特論A
詳細プロファイラ利用例 測定したい対象に、以下のコマンドを挿入 Fortran言語の場合 ヘッダファイル:なし 測定開始 手続き名: call fapp_start(name, number, level) 測定終了 手続き名: call fapp_stop(name, number, level) 利用例: call fapp_start(“region1”,1,1) C/C++言語の場合 ヘッダファイル: fj_tool/fjcoll.h 測定開始 関数名:void fapp_start(const char *name, int number, int level) 測定終了 関数名: void fapp_stop(const char *name, int number, int level) 利用例: fapp_start(“region1”,1,1); 25 2025年度 計算科学技術特論A
詳細プロファイラ利用例 /Wa2 に Profディレクトリを作成 $ mkdir Prof Wa2のwa2-pure.bash中に以下を記載 (キャッシュ情報取得時) fapp -C -d Prof –L 1 –Ihwm –Hevent=Cache mpirun ./wa2 実行する $ pjsub wa2-pure.bash 26 2025年度 計算科学技術特論A
CPU解析レポート(エクセル形式) 性能プロファイルは見にくい 性能プロファイルデータ(マシン語命令の種類や、実行 時間に占める割合など)を、Excelで可視化してくれる ツール コマンド例:fapp –c –Hevent=pa1 ./a.out 単体レポート: 1回測定 標準レポート:11回測定 詳細レポート:17回測定 27 2025年度 計算科学技術特論A
CPU解析レポート(エクセル形式) 手順 1. 2. 3. 4. 5. 6. 28 対象箇所(ループ)を、専用のAPIで指定する プロファイルを入れるフォルダを<測定数分>か所を つくる プロファイルのためのコマンドで<測定数分>回実 行する エクセル形式に変換する 4のエクセル形式を手元のパソコンに持ってくる 5のファイルを、指定のエクセルと同一のフォルダに 入れてから、指定のエクセルを開く 2025年度 計算科学技術特論A
CPU解析レポートのための指示API 以下のAPIで、対象となるループを挟む(Fortranの場合) call fapp_start (“region”, 1) <対象となるループ> call fapp_stop (“region”, 1) 詳細プロファイラの指定APIと同じです “region”は、対象となる場所の名前なので、任意の名前を付 けることが可能(後で、専用エクセルを開くときに使う) “1”は、レベルの指定で、数字を書く -L オプションで指定したレベル以上を測定 29 2025年度 計算科学技術特論A
表示例 ソース:FUJITSU Software Technical Computing Suite V4.0L20 Development Studioプロファイラ使用手引書, J2UL-2483-02Z0(00), 2020年3月 30 2025年度 計算科学技術特論A
そのほかの最適化技法 ループ分割、ループ消滅とスレッド並列化、等 31 2025年度 計算科学技術特論A
ループ分割・ループ消滅の事例 32 2025年度 計算科学技術特論A
ループ分割とループ消滅の実例(その1) Seism3D: 東京大学古村教授が開発した地震波のシミュレーション プログラム(における、ベンチマークプログラム) 東京大学情報基盤センターで開発中の 数値計算ミドルウェアppOpen-HPCにおける ppOpen-APPL/FDMとして開発 有限差分法(Finite Differential Method (FDM)) 3次元シミュレーション 3次元配列が確保される データ型: 単精度 (real*4) 33 2025年度 計算科学技術特論A
ループ分割とループ消滅の実例(その2) 作業領域が多い実装のため 最大問題サイズ: NX=256, NY=256, NZ=128(32GBメモリ) たった 32.1MB分しか問題空間として確保できない ⇒ほとんどのデータは、キャッシュに載ってしまう 時間ステップ数が大きい場合、総合時間を考慮すると1ステップ 当たりの実行時間を減らすしかない ⇒問題サイズを小さくする 近年のマルチコア計算機の傾向 L3キャッシュ(Last Level Cache, LLC)が大きくなってきている Xeon E5-2600 v3(Haswell-EP)、LLC: 45MB [L3/socket] FX100、Sparc64 XI-fx、LLC: 24 MB [L2/node] 次世代デバイス(Intel 3D Xpoint、ストレージクラスメモリ)など ではTB級(予想) ⇒問題空間の配列データが小さい時、キャッシュ上にデータが のりやすくなってきている 34 2025年度 計算科学技術特論A
主要カーネル(第1位): 全体の9.8% subroutine ppohFDM_update_stress (ファイル名:m_stress.f90) do k = NZ00, NZ01 do j = NY00, NY01 do i = NX00, NX01 RL1 = LAM (I,J,K) RM1 = RIG (I,J,K) RM2 = RM1 + RM1 RLRM2 = RL1+RM2 DXVX1 = DXVX(I,J,K) DYVY1 = DYVY(I,J,K) DZVZ1 = DZVZ(I,J,K) D3V3 = DXVX1 + DYVY1 + DZVZ1 DXVYDYVX1 = DXVY(I,J,K)+DYVX(I,J,K) DXVZDZVX1 = DXVZ(I,J,K)+DZVX(I,J,K) DYVZDZVY1 = DYVZ(I,J,K)+DZVY(I,J,K) SXX (I,J,K) = SXX (I,J,K) + (RLRM2*(D3V3)-RM2*(DZVZ1+DYVY1) ) * DT SYY (I,J,K) = SYY (I,J,K) + (RLRM2*(D3V3)-RM2*(DXVX1+DZVZ1) ) * DT SZZ (I,J,K) = SZZ (I,J,K) + (RLRM2*(D3V3)-RM2*(DXVX1+DYVY1) ) * DT SXY (I,J,K) = SXY (I,J,K) + RM1 * DXVYDYVX1 * DT SXZ (I,J,K) = SXZ (I,J,K) + RM1 * DXVZDZVX1 * DT SYZ (I,J,K) = SYZ (I,J,K) + RM1 * DYVZDZVY1 * DT end do end do 35 2025年度 計算科学技術特論A end do
主要カーネル(第2位): 全体の6.8% subroutine ppohFDM_update_stress_sponge (ファイル名:m_stress.f90) do k = NZ00, NZ01 gg_z = gz(k) do j = NY00, NY01 gg_y = gy(j) gg_yz = gg_y * gg_z do i = NX00, NX01 gg_x = gx(i) gg_xyz = gg_x * gg_yz SXX(I,J,K) = SXX(I,J,K) * gg_xyz SYY(I,J,K) = SYY(I,J,K) * gg_xyz SZZ(I,J,K) = SZZ(I,J,K) * gg_xyz SXY(I,J,K) = SXY(I,J,K) * gg_xyz SXZ(I,J,K) = SXZ(I,J,K) * gg_xyz SYZ(I,J,K) = SYZ(I,J,K) * gg_xyz end do end do end do 36 2025年度 計算科学技術特論A
主要カーネル(第3位): 全体の6.2% subroutine ppohFDM_update_vel (ファイル名:m_velocity.f90) do k = NZ00, NZ01 do j = NY00, NY01 do i = NX00, NX01 ! Effective Density ROX = 2.0_PN/( DEN(I,J,K) + DEN(I+1,J,K) ) ROY = 2.0_PN/( DEN(I,J,K) + DEN(I,J+1,K) ) ROZ = 2.0_PN/( DEN(I,J,K) + DEN(I,J,K+1) ) VX(I,J,K) = VX(I,J,K) + ( DXSXX(I,J,K)+DYSXY(I,J,K)+DZSXZ(I,J,K) )*ROX*DT VY(I,J,K) = VY(I,J,K) + ( DXSXY(I,J,K)+DYSYY(I,J,K)+DZSYZ(I,J,K) )*ROY*DT VZ(I,J,K) = VZ(I,J,K) + ( DXSXZ(I,J,K)+DYSYZ(I,J,K)+DZSZZ(I,J,K) )*ROZ*DT end do end do end do 37 2025年度 計算科学技術特論A
主要カーネル(第4位): 全体の5.8% subroutine ppohFDM_pdiffy3_p4 (ファイル名:m_pfd3d.f90) R40 = C40/DY R41 = C41/DY do K = 1, NZ do I = 1, NX do J = 1, NY DYV (I,J,K) = (V(I,J+1,K)-V(I,J,K) )*R40 - (V(I,J+2,K)-V(I,J-1,K))*R41 end do end do end do 38 2025年度 計算科学技術特論A
カーネルループの構造 以下の3重ループを検討する (ppOpen-APPL/FDMの第1位ループと同等) DO K = 1, NZ DO J = 1, NY DO I = 1,NX RL = LAM (I,J,K) RM = RIG (I,J,K) RM2 = RM + RM RMAXY = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I+1,J,K) + 1.0/RIG(I,J+1,K) + 1.0/RIG(I+1,J+1,K)) RMAXZ = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I+1,J,K) + 1.0/RIG(I,J,K+1) + 1.0/RIG(I+1,J,K+1)) RMAYZ = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I,J+1,K) + 1.0/RIG(I,J,K+1) + 1.0/RIG(I,J+1,K+1)) RLTHETA = (DXVX(I,J,K)+DYVY(I,J,K)+DZVZ(I,J,K))*RL QG = ABSX(I)*ABSY(J)*ABSZ(K)*Q(I,J,K) SXX (I,J,K) = ( SXX (I,J,K) + (RLTHETA + RM2*DXVX(I,J,K))*DT )*QG SYY (I,J,K) = ( SYY (I,J,K) + (RLTHETA + RM2*DYVY(I,J,K))*DT )*QG SZZ (I,J,K) = ( SZZ (I,J,K) + (RLTHETA + RM2*DZVZ(I,J,K))*DT )*QG SXY (I,J,K) = ( SXY (I,J,K) + (RMAXY*(DXVY(I,J,K)+DYVX(I,J,K)))*DT )*QG SXZ (I,J,K) = ( SXZ (I,J,K) + (RMAXZ*(DXVZ(I,J,K)+DZVX(I,J,K)))*DT )*QG SYZ (I,J,K) = ( SYZ (I,J,K) + (RMAYZ*(DYVZ(I,J,K)+DZVY(I,J,K)))*DT )*QG END DO END DO END DO 39 2025年度 計算科学技術特論A
ここでのコード最適化の方針(その1) ループ分割 (Loop Splitting) スピルコード 「富岳」ではレジスタ数 が少なく、スピルコード が出やすい →ループ分割で回避 (レジスタから追い出されるデータがある コード)を防ぐ目的で行う。 レジスタを最大限に使うプログラムで、 メモリからのデータ読み出しを削減し、 高速化する。 40 2025年度 計算科学技術特論A
ここでのコード最適化の方針(その2) ループ消滅(Loop Collapse) 対象は3重ループ → 以下の2つの方針がある 1次元ループ化 スレッド並列実行のため、最外側のループ長を増加させる 目的で行う ベクトル計算機用のコンパイラで行われることが多い メニーコア計算機でも状況により効果が見込まれる 2次元ループ化 スレッド並列実行のため、最外側のループ長を増加させる 目的で行う コンパイラによる最内ループのプリフェッチ処理を増進 近年のメニーコア計算機でもっとも有望と思われる方法 41 2025年度 計算科学技術特論A
ループ分割の例 – 分割点 例:以下の箇所でループ分割する例 DO K = 1, NZ DO J = 1, NY DO I = 1,NX RL(I) = LAM (I,J,K) RM(I) = RIG (I,J,K) RM2(I) = RM(I) + RM(I) RMAXY(I) = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I+1,J,K) + 1.0/RIG(I,J+1,K) + 1.0/RIG(I+1,J+1,K)) RMAXZ(I) = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I+1,J,K) + 1.0/RIG(I,J,K+1) + 1.0/RIG(I+1,J,K+1)) RMAYZ(I) = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I,J+1,K) + 1.0/RIG(I,J,K+1) + 1.0/RIG(I,J+1,K+1)) RLTHETA(I) = (DXVX(I,J,K)+DYVY(I,J,K)+DZVZ(I,J,K))*RL(I) QG(I) = ABSX(I)*ABSY(J)*ABSZ(K)*Q(I,J,K) END DO ループ分割点 DO I = 1, NX SXX (I,J,K) = ( SXX (I,J,K) + (RLTHETA(I) + RM2(I)*DXVX(I,J,K))*DT )*QG(I) SYY (I,J,K) = ( SYY (I,J,K) + (RLTHETA(I) + RM2(I)*DYVY(I,J,K))*DT )*QG(I) SZZ (I,J,K) = ( SZZ (I,J,K) + (RLTHETA(I) + RM2(I)*DZVZ(I,J,K))*DT )*QG(I) SXY (I,J,K) = ( SXY (I,J,K) + (RMAXY(I)*(DXVY(I,J,K)+DYVX(I,J,K)))*DT )*QG(I) SXZ (I,J,K) = ( SXZ (I,J,K) + (RMAXZ(I)*(DXVZ(I,J,K)+DZVX(I,J,K)))*DT )*QG(I) SYZ (I,J,K) = ( SYZ (I,J,K) + (RMAYZ(I)*(DYVZ(I,J,K)+DZVY(I,J,K)))*DT )*QG(I) END DO END DO 42 2025年度 計算科学技術特論A END DO
ループ消滅 – 1重ループ化 例) 利点:ループ長が増える NZ → NZ*NY*NX DO KK = 1, NZ * NY * NX K = (KK-1)/(NY*NX) + 1 J = mod((KK-1)/NX,NY) + 1 I = mod(KK-1,NX) + 1 RL = LAM (I,J,K) RM = RIG (I,J,K) RM2 = RM + RM RMAXY = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I+1,J,K) + 1.0/RIG(I,J+1,K) + 1.0/RIG(I+1,J+1,K)) RMAXZ = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I+1,J,K) + 1.0/RIG(I,J,K+1) + 1.0/RIG(I+1,J,K+1)) RMAYZ = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I,J+1,K) + 1.0/RIG(I,J,K+1) + 1.0/RIG(I,J+1,K+1)) RLTHETA = (DXVX(I,J,K)+DYVY(I,J,K)+DZVZ(I,J,K))*RL QG = ABSX(I)*ABSY(J)*ABSZ(K)*Q(I,J,K) SXX (I,J,K) = ( SXX (I,J,K) + (RLTHETA + RM2*DXVX(I,J,K))*DT )*QG SYY (I,J,K) = ( SYY (I,J,K) + (RLTHETA + RM2*DYVY(I,J,K))*DT )*QG SZZ (I,J,K) = ( SZZ (I,J,K) + (RLTHETA + RM2*DZVZ(I,J,K))*DT )*QG SXY (I,J,K) = ( SXY (I,J,K) + (RMAXY*(DXVY(I,J,K)+DYVX(I,J,K)))*DT )*QG SXZ (I,J,K) = ( SXZ (I,J,K) + (RMAXZ*(DXVZ(I,J,K)+DZVX(I,J,K)))*DT )*QG SYZ (I,J,K) = ( SYZ (I,J,K) + (RMAYZ*(DYVZ(I,J,K)+DZVY(I,J,K)))*DT )*QG END DO 43 2025年度 計算科学技術特論A
ループ消滅 – 2重ループ化 例) 利点:ループ長が増える NZ → NZ*NY DO KK = 1, NZ * NY K = (KK-1)/NY + 1 J = mod(KK-1,NY) + 1 DO I = 1, NX このI-ループは連続: RL = LAM (I,J,K) コンパイラによるプリフェッチコード生成が可能 RM = RIG (I,J,K) RM2 = RM + RM RMAXY = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I+1,J,K) + 1.0/RIG(I,J+1,K) + 1.0/RIG(I+1,J+1,K)) RMAXZ = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I+1,J,K) + 1.0/RIG(I,J,K+1) + 1.0/RIG(I+1,J,K+1)) RMAYZ = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I,J+1,K) + 1.0/RIG(I,J,K+1) + 1.0/RIG(I,J+1,K+1)) RLTHETA = (DXVX(I,J,K)+DYVY(I,J,K)+DZVZ(I,J,K))*RL QG = ABSX(I)*ABSY(J)*ABSZ(K)*Q(I,J,K) SXX (I,J,K) = ( SXX (I,J,K) + (RLTHETA + RM2*DXVX(I,J,K))*DT )*QG SYY (I,J,K) = ( SYY (I,J,K) + (RLTHETA + RM2*DYVY(I,J,K))*DT )*QG SZZ (I,J,K) = ( SZZ (I,J,K) + (RLTHETA + RM2*DZVZ(I,J,K))*DT )*QG SXY (I,J,K) = ( SXY (I,J,K) + (RMAXY*(DXVY(I,J,K)+DYVX(I,J,K)))*DT )*QG SXZ (I,J,K) = ( SXZ (I,J,K) + (RMAXZ*(DXVZ(I,J,K)+DZVX(I,J,K)))*DT )*QG SYZ (I,J,K) = ( SYZ (I,J,K) + (RMAYZ*(DYVZ(I,J,K)+DZVY(I,J,K)))*DT )*QG ENDDO END DO 44 2025年度 計算科学技術特論A
さらなる改良:定義-参照距離の変更 DO K = 1, NZ DO J = 1, NY DO I = 1, NX RL = LAM (I,J,K) RM = RIG (I,J,K) RM2 = RM + RM RLTHETA = (DXVX(I,J,K)+DYVY(I,J,K)+DZVZ(I,J,K))*RL QG = ABSX(I)*ABSY(J)*ABSZ(K)*Q(I,J,K) SXX (I,J,K) = ( SXX (I,J,K)+ (RLTHETA + RM2*DXVX(I,J,K))*DT )*QG SYY (I,J,K) = ( SYY (I,J,K)+ (RLTHETA + RM2*DYVY(I,J,K))*DT )*QG SZZ (I,J,K) = ( SZZ (I,J,K) + (RLTHETA + RM2*DZVZ(I,J,K))*DT )*QG RMAXY = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I+1,J,K) + 1.0/RIG(I,J+1,K) + 1.0/RIG(I+1,J+1,K)) RMAXZ = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I+1,J,K) + 1.0/RIG(I,J,K+1) + 1.0/RIG(I+1,J,K+1)) RMAYZ = 4.0/(1.0/RIG(I,J,K) + 1.0/RIG(I,J+1,K) + 1.0/RIG(I,J,K+1) + 1.0/RIG(I,J+1,K+1)) SXY (I,J,K) = ( SXY (I,J,K) + (RMAXY*(DXVY(I,J,K)+DYVX(I,J,K)))*DT )*QG SXZ (I,J,K) = ( SXZ (I,J,K) + (RMAXZ*(DXVZ(I,J,K)+DZVX(I,J,K)))*DT )*QG SYZ (I,J,K) = ( SYZ (I,J,K) + (RMAYZ*(DYVZ(I,J,K)+DZVY(I,J,K)))*DT )*QG END DO END DO END DO 45 2025年度 計算科学技術特論A
修正コード + I-ループ分割の例 DO K = 1, NZ DO J = 1, NY DO I = 1, NX RL = LAM (I,J,K) RM = RIG (I,J,K) RM2 = RM + RM RLTHETA = (DXVX(I,J,K)+DYVY(I,J,K)+DZVZ(I,J,K))*RL QG = ABSX(I)*ABSY(J)*ABSZ(K)*Q(I,J,K) SXX (I,J,K) = ( SXX (I,J,K) + (RLTHETA + RM2*DXVX(I,J,K))*DT )*QG SYY (I,J,K) = ( SYY (I,J,K) + (RLTHETA + RM2*DYVY(I,J,K))*DT )*QG SZZ (I,J,K) = ( SZZ (I,J,K) + (RLTHETA + RM2*DZVZ(I,J,K))*DT )*QG ENDDO DO I = 1, NX STMP1 = 1.0/RIG(I,J,K) STMP2 = 1.0/RIG(I+1,J,K) STMP4 = 1.0/RIG(I,J,K+1) STMP3 = STMP1 + STMP2 RMAXY = 4.0/(STMP3 + 1.0/RIG(I,J+1,K) + 1.0/RIG(I+1,J+1,K)) RMAXZ = 4.0/(STMP3 + STMP4 + 1.0/RIG(I+1,J,K+1)) RMAYZ = 4.0/(STMP3 + STMP4 + 1.0/RIG(I,J+1,K+1)) QG = ABSX(I)*ABSY(J)*ABSZ(K)*Q(I,J,K) SXY (I,J,K) = ( SXY (I,J,K) + (RMAXY*(DXVY(I,J,K)+DYVX(I,J,K)))*DT )*QG SXZ (I,J,K) = ( SXZ (I,J,K) + (RMAXZ*(DXVZ(I,J,K)+DZVX(I,J,K)))*DT )*QG SYZ (I,J,K) = ( SYZ (I,J,K) + (RMAYZ*(DYVZ(I,J,K)+DZVY(I,J,K)))*DT )*QG END DO END DO END 46 DO 2025年度 計算科学技術特論A ループ分割すると、 QGの再計算が必要になる 通常のコンパイラでは ユーザの判断が必要 なので、できない
修正コード + K-ループの分割の例 DO K = 1, NZ DO J = 1, NY DO I = 1, NX RL = LAM (I,J,K) RM = RIG (I,J,K) RM2 = RM + RM RLTHETA = (DXVX(I,J,K)+DYVY(I,J,K)+DZVZ(I,J,K))*RL QG = ABSX(I)*ABSY(J)*ABSZ(K)*Q(I,J,K) SXX (I,J,K) = ( SXX (I,J,K) + (RLTHETA + RM2*DXVX(I,J,K))*DT )*QG SYY (I,J,K) = ( SYY (I,J,K) + (RLTHETA + RM2*DYVY(I,J,K))*DT )*QG SZZ (I,J,K) = ( SZZ (I,J,K) + (RLTHETA + RM2*DZVZ(I,J,K))*DT )*QG ENDDO; ENDDO; ENDDO 完全に別の3重ループに分かれる ←分かれた3重ループに対し、 コンパイラによるさらなる最適化の可能性 DO K = 1, NZ DO J = 1, NY DO I = 1, NX STMP1 = 1.0/RIG(I,J,K) STMP2 = 1.0/RIG(I+1,J,K) STMP4 = 1.0/RIG(I,J,K+1) STMP3 = STMP1 + STMP2 RMAXY = 4.0/(STMP3 + 1.0/RIG(I,J+1,K) + 1.0/RIG(I+1,J+1,K)) RMAXZ = 4.0/(STMP3 + STMP4 + 1.0/RIG(I+1,J,K+1)) RMAYZ = 4.0/(STMP3 + STMP4 + 1.0/RIG(I,J+1,K+1)) QG = ABSX(I)*ABSY(J)*ABSZ(K)*Q(I,J,K) SXY (I,J,K) = ( SXY (I,J,K) + (RMAXY*(DXVY(I,J,K)+DYVX(I,J,K)))*DT )*QG SXZ (I,J,K) = ( SXZ (I,J,K) + (RMAXZ*(DXVZ(I,J,K)+DZVX(I,J,K)))*DT )*QG SYZ (I,J,K) = ( SYZ (I,J,K) + (RMAYZ*(DYVZ(I,J,K)+DZVY(I,J,K)))*DT )*QG 47 2025年度 計算科学技術特論A END DO; END DO; END DO;
マルチコアCPUではループ消滅が有効? 一般に、3次元陽解法のカーネルは以下の構造 OpenMPのスレッド並列化は最外側ループに適用 この時、並列性はK-ループ長のNZで決まる !$omp parallel do private(…) (NZ>スレッド数) が並列性のため必要 DO K = 1, NZ OpenMPオーバヘッドを考えると、ノードあたりのNZ DO J = 1, NY はスレッド数の2~3倍必要 DO I = 1, NX 例)68スレッドなら、NZは140~210以上 <離散化手法に基づく数式> HTで272スレッド実行なら、NZは540~810以上 3次元問題で上記のサイズ(ノード当たりの ENDDO 問題サイズ)は確保できるか? ENDDO ENDDO ループ長が確保できない場合 !$omp end parallel do ループ消滅が必須 48 2025年度 計算科学技術特論A
そのほかの最適化技法 ハイブリッドMPI/OpenMPの実行形態 49 2025年度 計算科学技術特論A
名古屋大学FX100 (2020年3月末退役済み) The Fujitsu PRIMEHPC FX100 Contents Whole System Specifications Total Performance 3.2 PFLOPS Total Memory Amounts 90 TiB Total #nodes 2,880 Inter Connection The TOFU2 (6 Dimension Mesh / Torus) Local File System Amounts 6.0 PB 2880 Nodes (92,160 Cores) Contents Node Processor Specifications Theoretical Peak Performance 1 TFLOPS (double precision) #Processors (#Cores) 32 + 2 (assistant cores) Main Memory Amounts 32 GB Processor Name SPARC64 XI-fx Frequency 2.2 GHz 2025年度 計算科学技術特論A Theoretical Peak Performance (Core) 31.25 GFLOPS 50
スーパーコンピュータ「不老」 Type I サブシステム(FX1000) 機種名 FUJITSU PRIMEHPC FX1000 計算ノード CPU A64FX (Armv8.2-A + SVE), 48コア+2アシスタント コア( I/O兼計算ノードは48コア+ 4アシスタント コア ), 2.2GHz, 1ソケット メインメモリ HBM2, 32GiB 倍精度 3.3792 TFLOPS, 単精度 6.7584 TFLOPS, 理論演算性能 半精度 13.5168 TFLOPS 1,024 GB/s (1CMG=12コアあたり256 GB/s, メモリバンド幅 1CPU=4CMG) 2,304ノード, 110,592コア ノード数、総コア数 (+4,800アシスタントコア) 7.782 PFLOPS 総理論演算性能 72 TiB 総メモリ容量 TofuインターコネクトD 各ノードは周囲の隣接ノードへ同時に ノード間インターコネクト 合計 40.8 GB/s × 双方向 で通信可能(1リンク 当たり 6.8 GB/s × 双方向, 6リンク同時通信 可能) ユーザ用 なし ローカルストレージ 冷却方式 水冷 2025年度 計算科学技術特論A ノード内構成 51
実行詳細 • ppOpen-APPL/FDM ver.1.0 (差分法コード) • 時間ステップ数: 2000 steps • ノード数: 8 node • 問題サイズ (8 GB/node) – NX * NY * NZ = 512 x 512 x 512 / 8 Node – NX * NY * NZ = 256 * 256 * 256 / node (!= MPI プロセス) • 対象 MPIプロセス数 と スレッド数 – PXTY: X MPIプロセス、 Y スレッド/プロセス – P8T32 : 最小の MPI-OpenMP実行条件(ppOpen-APPL/FDM): 最低でも 8 MPIプロセスが要るため – P16T16 – P32T8 – P64T4 – P128T2 – P256T1: ピュア MPI実行 2025年度 計算科学技術特論A • 対象当たりの実行回数:100 52
NUMA アフィニティ • Sparc64 XIfx (FX100) 、および、ARM A64FX (FX1000, Flow) は NUMA • (FX100) 2ソケット相当: 16 コア ×2ソケット相当 • (FX1000) 4ソケット相当: 12コア×4ソケット相当 • NUMA アフィニティの詳細 (FX100のみ) – メモリ割り当て • “Local allocation” • plm_ple_memory_allocation_policy=localalloc – CPU割り当て • P8 と P16: plm_ple_numanode_assign_policy=simplex • P32以上: plm_ple_numanode_assign_policy=share_band 2025年度 計算科学技術特論A 53
[Seconds] 200 180 全体時間 (2000 time steps):FX100 FX100 NX*NY*NZ = 512 x512 x 512 / 8ノード Comm. Time 160 Hybrid MPI/OpenMP FX100: 8ノード (256スレッド) 140 2.55x 120 100 Others IO passing_stre ss passing_velo city Full AT 80 update_vel_ sponge 60 update_vel 40 20 Comp. Time update_stre ss_sponge オリジナルコード 0 P8T32 2025年度 計算科学技術特論A P16T16 P32T8 P64T4 P128T2 P256T1 update_stre ss 54
全体時間 (2000 time steps):FX1000 (「不老」) [Seconds] 200 180 Comm. Time 160 140 FX1000 (「不老」) Others NX*NY*NZ = 512 x512 x 512 / 8ノード IO Hybrid MPI/OpenMP FX100: 8ノード (384スレッド) passing_stre ss NUMAの影響を より受けやすい passing_velo city 120 100 Full AT 4.06x 80 update_vel_ sponge 60 update_vel 40 20 Comp. Time update_stre ss_sponge オリジナルコード 0 P8T48 P64T6計算科学技術特論A P16T24 P32T122025年度 P128T3 P192T2 P384T1 update_stre ss 55
そのほかの最適化技法 データ構造の変換:AoS、SoA 56 2025年度 計算科学技術特論A
データ構造変換:AoS vs. SoA 構造体配列:Array of Structures(AoS) 配列 構造体 x0 y0 z0 構造体 x1 y1 z1 構造体 x2 y2 z2 … 構造体 xn yn zn 利点 自然なデータ構造で扱いやすい 欠点 x0→x1→x2→・・・→xnと アクセスするとキャッシュミスが生じ、 性能劣化する 配列構造体:Structure of Arrays (SoA) 構造体 57 x配列 x0 x1 x2 x3 … xn y配列 y0 y1 y2 y3 … yn z配列 z0 z1 z2 z3 … zn 2025年度 計算科学技術特論A
Modylasにおけるデータ構造変換による 高速化の実例 表 配列形状変更によるP2P(code1)演算時間の削減効果. 単位はms. 1ITO, -xHost -qopt-zmm-usage=high指定. 2Oakforest-PACS, -axMIC-AVX512指定. Skylake-SP1 従来 (AoS) 2.140 KNL2 8.582 SoA 実行時間 削減率 1.976 8% 6.048 30% (source )Modylas: [1] www.modylas.org [2] Yoshimichi Ando, et.al., “MODYLAS: A Highly Parallelized General-Purpose Molecular Dynamics Simulation Program for Large-Scale Systems with Long-Range Forces Calculated by Fast Multipole Method (FMM) and Highly Scalable Fine-Grained New Parallel Processing Algorithms”, J. Chem. Theo. Comp.,9, 3201-3209 (2013) [3] Yoshimichi Andoh, et.al., “A thread-level parallelization of pairwise additive potential and force calculations suitable for current many-core architectures”, The Journal of Supercomputing, 74 (6), pp. 2449-2469 (2018) 58 2025年度 計算科学技術特論A
AoS からSoAのデータ変換の注意点 実際のプログラムでは、元のデータ構造がAoSになって いることが多く、プログラム全体をSoAに書き換えること ができないことが多い そのため、以下の手順を取ることが多い 1. 対象の計算に入る前にSoAの配列を確保 2. AoSのデータをSoAに変換(コピー) 3. SoAで計算 4. SoAのデータをAoSに変換(コピー) 1により2倍のメモリ量が必要、2、4により、コピー時間 が必要。このデメリットに対して、3の計算時間の 高速化で元が取れる場合のみ有効 59 2025年度 計算科学技術特論A
通信最適化の方法 60 2025年度 計算科学技術特論A
メッセージサイズと通信回数 領域② メッセージサイズに比例して、実行時間が 増えていく領域 通信時間[秒] 1 / 傾き係数[秒/バイト] = メモリバンド幅 [バイト/秒] 領域① メッセージサイズに 依存せず、ほぼ 一定時間の領域 通信 立ち上がり 時間 = 通信 レイテンシ [秒] 0 61 領域②の通信時間の計算式 通信時間 = 通信レイテンシ2 + 傾き係数 × メッセージサイズ 通信レイテンシ2 [秒] 数百バイト 2025年度 メッセージサイズ[バイト] 計算科学技術特論A
通信最適化時に注意すること(その1) 自分のアプリケーションの通信パターンについて、 以下の観点を知らないと通信の最適化ができない <領域①><領域②>のどちらになるのか 通信の頻度(回数)はどれほどか 領域①の場合 「通信レイテンシ」が実行時間のほとんど 通信回数を削減する 細切れに送っているデータをまとめて1回にする、など 領域②の場合 「メッセージ転送時間」が実行時間のほとんど メッセージサイズを削減する 冗長計算をして計算量を増やしてでもメッセージサイズを削減する、など 62 2025年度 計算科学技術特論A
領域①となる通信の例 内積演算のためのリダクション(MPI_Allreduce)などの送信データ は倍精度1個分(8バイト) 8バイトの規模だと、数個分を同時にMPI_Allreduceする時間と、 1個分をMPI_Allreduceをする時間は、ほぼ同じ時間となる ⇒複数回分の内積演算を一度に行うと高速化される可能性あり 例)連立一次方程式の反復解法CG法中の内積演算 通常の実装だと、1反復に3回の内積演算がある このため、内積部分は通信レイテンシ律速となる k反復を1度に行えば、内積に関する通信回数は1/k回に削減 ただし、単純な方法では、丸め誤差の影響で収束しない。 通信回避CG法(Communication Avoiding CG, CACG)として 現在活発に研究されている。 63 2025年度 計算科学技術特論A
通信最適化時に注意すること(その2) 「同期点」を減らすことも高速化につながる MPI関数の「ノン・ブロッキング関数」を使う ブロッキング関数 MPI_SEND() → ノン・ブロッキング関数 MPI_ISEND() 通信と演算を同時に行うようにする。 例: ランク0 計算 ランク1 計算 send send 計算 受信待 recv send 計算 受信待 recv 計算 同期点 受信待 recv 計算 … … ノン・ブロッキング関数の利用 ランク0 計算 ランク1 計算 64 isend irecv isend 計算 計算 2025年度 計算 irecv isend 計算 計算科学技術特論A … irecv … 高速化
非同期通信: Isend、Irecv、永続的通信関数 65 2025年度 計算科学技術特論A
ブロッキング通信で効率の悪い例 プロセス0が必要なデータを持っている場合 連続するsendで、効率の悪い受信待ち時間が多発 プロセス0 計算 プロセス1 計算 プロセス2 計算 プロセス3 計算 … send 受信待 send recv 受信待 send 受信待 計算 recv … 計算 次の反復での同期待ち 計算 recv 次の反復での同期待ち 計算 次の反復での 同期待 同期待ち … 次の 反復での 同期点 66 2025年度 計算科学技術特論A
1対1通信に対するMPI用語 ブロッキング?ノンブロッキング? 67 2025年度 計算科学技術特論A
ブロッキング、ノンブロッキング 1. ブロッキング 2. 送信/受信側のバッファ領域にメッセージが 格納され、受信/送信側のバッファ領域が 自由にアクセス・上書きできるまで、 呼び出しが戻らない バッファ領域上のデータの一貫性を保障 ノンブロッキング 送信/受信側のバッファ領域のデータを保障せず すぐに呼び出しが戻る バッファ領域上のデータの一貫性を保障せず 一貫性の保証はユーザの責任 68 2025年度 計算科学技術特論A
ローカル、ノンローカル ローカル 手続きの完了が、それを実行しているプロセス のみに依存する。 ほかのユーザプロセスとの通信を必要としない 処理。 ノンローカル 操作を完了するために、別のプロセスでの何らか のMPI手続きの実行が必要かもしれない。 別のユーザプロセスとの通信を必要とするかもし れない処理。 69 2025年度 計算科学技術特論A
通信モード(送信発行時の場合) 標準通信モード (ノンローカル) :デフォルト 1. 送出メッセージのバッファリングはMPIに任せる。 バッファ通信モード (ローカル) 2. 必ずバッファリングする。バッファ領域がないときはエラー。 同期通信モード (ノンローカル) 3. バッファ領域が再利用でき、かつ、対応する受信/送信が 開始されるまで待つ。 レディ通信モード (処理自体はローカル) 4. 対応する受信が既に発行されている場合のみ実行できる。 それ以外はエラー。 70 バッファリングされるとき:相手の受信起動前に送信を完了可能; バッファリングされないとき:送信が完全終了するまで待機; ハンドシェーク処理を無くせるため、高い性能を発揮する。 2025年度 計算科学技術特論A
実例-MPI_Send MPI_Send関数 ブロッキング 標準通信モード(ノンローカル) バッファ領域が安全な状態になるまで戻らない バッファ領域がとれる場合: メッセージがバッファリングされる。対応する受信が 起動する前に、送信を完了できる。 バッファ領域がとれない場合: 対応する受信が発行されて、かつ、メッセージが 受信側に完全にコピーされるまで、送信処理を 完了できない。 71 2025年度 計算科学技術特論A
非同期通信関数 ierr = MPI_Isend(sendbuf, icount, datatype, idest, itag, icomm, irequest); sendbuf : 送信領域の先頭番地を指定する icount : 整数型。送信領域のデータ要素数を指定する datatype : 整数型。送信領域のデータの型を指定する idest : 整数型。送信したいPEのicomm 内でのランクを 指定する itag : 整数型。受信したいメッセージに付けられたタグ の値を指定する 72 2025年度 計算科学技術特論A
非同期通信関数 icomm : 整数型。PE集団を認識する番号 であるコミュニケータを指定する。 通常ではMPI_COMM_WORLD を指定 すればよい。 irequest : MPI_Request型(整数型の配列)。 送信を要求したメッセージにつけられた 識別子が戻る。 ierr : 整数型。エラーコードが入る。 73 2025年度 計算科学技術特論A
同期待ち関数 ierr = MPI_Wait(irequest, istatus); irequest : MPI_Request型(整数型配列)。 送信を要求したメッセージにつけられた識別子。 istatus : MPI_Status型(整数型配列)。 受信状況に関する情報が入る。 要素数がMPI_STATUS_SIZEの整数配列を宣言して 指定する。 受信したメッセージの送信元のランクが istatus[MPI_SOURCE] 、タグがistatus[MPI_TAG] に 代入される。 74 2025年度 計算科学技術特論A
実例-MPI_Isend MPI_Isend関数 ノンブロッキング 標準通信モード(ノンローカル) 通信バッファ領域の状態にかかわらず戻る バッファ領域がとれる場合は、メッセージが バッファリングされ、対応する受信が起動する前に、 送信処理が完了できる バッファ領域がとれない場合は、対応する受信が 発行され、メッセージが受信側に完全にコピーされる まで、送信処理が完了できない 75 MPI_Wait関数が呼ばれた場合の振舞いと理解すべき。 2025年度 計算科学技術特論A
注意点 以下のように解釈してください: MPI_Send関数 関数中にMPI_Wait関数が入っている; MPI_Isend関数 関数中にMPI_Wait関数が入っていない; かつ、すぐにユーザプログラム戻る; 76 2025年度 計算科学技術特論A
並列化の注意(MPI_Send、MPI_Recv) 全員がMPI_Sendを先に発行すると、その場所で処理が 止まる。(cf. 標準通信モードを考慮) (正確には、動いたり、動かなかったり、する) MPI_Sendの処理中で、場合により、バッファ領域がなくなる。 バッファ領域が空くまで待つ(スピンウェイトする)。 しかし、送信側バッファ領域不足から、永遠に空かない。 これを回避するためには、例えば以下の実装を行う。 ランク番号が2で割り切れるプロセス: MPI_Send(); MPI_Recv(); それ以外: MPI_Recv(); それぞれに対応 MPI_Send(); 77 2025年度 計算科学技術特論A
非同期通信 TIPS メッセージを完全に受け取ることなく、 受信したメッセージの種類を確認したい 送信メッセージの種類により、受信方式を 変えたい場合 MPI_Probe 関数 (ブロッキング) MPI_Iprobe 関数 (ノンブロッキング) MPI_Cancel 関数 (ノンブロッキング、 ローカル) 78 2025年度 計算科学技術特論A
MPI_Probe 関数 ierr = MPI_Probe(isource, itag, icomm, istatus) ; isource: 整数型。送信元のランク。 MPI_ANY_SOURCE (整数型)も指定可能 itag: 整数型。タグ値。 MPI_ANY_TAG (整数型) も指定可能 icomm: 整数型。コミュニケータ。 istatus: ステータスオブジェクト。 isource, itagに指定されたものがある場合のみ戻る 79 2025年度 計算科学技術特論A
MPI_Iprobe関数 ierr = MPI_Iprobe(isource, itag, icomm, iflag, istatus) ; isource: 整数型。送信元のランク。 MPI_ANY_SOURCE (整数型) も指定可能。 itag: 整数型。タグ値。 MPI_ANY_TAG (整数型) も指定可能。 icomm: 整数型。コミュニケータ。 iflag: 論理型。 isource, itagに指定されたものが あった場合はtrueを返す。 istatus: ステータスオブジェクト。 80 2025年度 計算科学技術特論A
MPI_Cancel 関数 ierr = MPI_Cancel(irequest); irequest: 整数型。通信要求(ハンドル) 目的とする通信が実際に取り消される以前に、 可能な限りすばやく戻る。 取消しを選択するため、MPI_Request_free関数、 MPI_Wait関数、又は MPI_Test関数 (または任意の対応する操作)の呼出しを利用して 完了されている必要がある。 81 2025年度 計算科学技術特論A
ノン・ブロッキング通信例(C言語) if (myid == 0) { … for (i=1; i<numprocs; i++) { ierr = MPI_Isend( &a[0], N, MPI_DOUBLE, i, i_loop, MPI_COMM_WORLD, &irequest[i] ); ランク0のプロセスは、 ランク1~numprocs-1までのプロセス に対して、ノンブロッキング通信を 用いて、長さNのDouble型配列 データを送信 } } else { ierr = MPI_Recv( &a[0], N, MPI_DOUBLE, 0, i_loop, MPI_COMM_WORLD, &istatus ); } プロセス0は、recvを a[ ]を使った計算処理; 待たず計算を開始 if (myid == 0) { for (i=1; i<numprocs; i++) { ierr = MPI_Wait(&irequest[i], &istatus); } ランク1~numprocs-1までの プロセスは、ランク0からの 受信待ち。 ランク0のPEは、 ランク1~numprocs-1までのプロセス に対するそれぞれの送信に対し、 それぞれが受信完了するまで ビジーウェイト(スピンウェイト) する。 } 82 2025年度 計算科学技術特論A
ノン・ブロッキング通信の例 (Fortran言語) if (myid .eq. 0) then … do i=1, numprocs - 1 call MPI_ISEND( a, N, MPI_DOUBLE_PRECISION, i, i_loop, MPI_COMM_WORLD, irequest, ierr ) enddo else call MPI_RECV( a, N, MPI_DOUBLE,_PRECISION , 0, i_loop, MPI_COMM_WORLD, istatus, ierr ) endif a( )を使った計算処理 if (myid .eq. 0) then プロセス0は、recvを 待たず計算を開始 do i=1, numprocs - 1 call MPI_WAIT(irequest(i), istatus, ierr ) enddo ランク0のプロセスは、 ランク1~numprocs-1までの プロセスに対して、ノンブロッキング 通信を用いて、長さNの DOUBLE PRECISION型配列 データを送信 ランク1~numprocs-1までの プロセスは、 ランク0からの受信待ち。 ランク0のプロセスは、 ランク1~numprocs-1までの プロセスに対するそれぞれの送信 に対し、それぞれが受信完了 するまでビジーウェイト (スピンウェイト)する。 endif 83 2025年度 計算科学技術特論A
ノン・ブロッキング通信による改善 プロセス0が必要なデータを持っている場合 連続するsendにおける受信待ち時間を ノン・ブロッキング通信で削減 プロセス0 計算 プロセス1 計算 プロセス2 計算 プロセス3 計算 … 84 send send send recv … 計算 受信待ちを、MPI_Waitで 計算の後に行うように変更 計算 受信待 次の反復で 同期待ち の同期待ち 次の反復での同期待ち recv 計算 recv … 次の反復での同期待ち 計算 次の 反復での 同期点 2025年度 計算科学技術特論A
永続的通信(その1) ノン・ブロッキング通信は、MPI_ISENDの実装が、 MPI_ISENDを呼ばれた時点で本当に通信を開始する 実装になっていないと意味がない。 ところが、MPIの実装によっては、MPI_WAITが呼ばれる まで、MPI_ISENDの通信を開始しない実装がされている ことがある。 この場合には、ノン・ブロッキング通信の効果が全くない。 永続的通信(Persistent Communication)を利用すると、 MPIライブラリの実装に依存し、ノン・ブロッキング通信の 効果が期待できる場合がある。 永続的通信は、MPI-1からの仕様(たいていのMPIで使える) しかし、通信と演算がオーバラップできる実装になっているかは別問題 85 2025年度 計算科学技術特論A
永続的通信(その2) 永続的通信の利用法 1. 2. 3. 通信を利用するループ等に入る前に1度、通信相手先を 設定する初期化関数を呼ぶ その後、SENDをする箇所にMPI_START関数を書く 真の同期ポイントに使う関数(MPI_WAIT等)は、ISENDと同じ ものを使う MPI_SEND_INIT関数で通信情報を設定しておくと、 MPI_START時に通信情報の設定が行われない 同じ通信相手に何度でもデータを送る場合、通常の ノン・ブロッキング通信に対し、同等以上の性能が出ると期待 適用例 領域分割に基づく陽解法 陰解法のうち反復解法を使っている数値解法 86 2025年度 計算科学技術特論A
永続的通信の実装例(C言語) MPI_Status istatus; メインループに入る前に、 MPI_Request irequest; 送信データの相手先情報を … 初期化する if (myid == 0) { for (i=1; i<numprocs; i++) { ierr = MPI_Send_init (a, N, MPI_DOUBLE_PRECISION, i, 0, MPI_COMM_WORLD, irequest ); } } … ここで、データを送る if (myid == 0) { for (i=1; i<numprocs; i++) { ierr = MPI_Start ( irequest ); } } /* 以降は、Isendの例と同じ */ 87 2025年度 計算科学技術特論A
永続的通信の実装例(Fortran言語) integer istatus(MPI_STATUS_SIZE) メインループに入る前に、 integer irequest(0:MAX_RANK_SIZE) 送信データの相手先情報を … 初期化する if (myid .eq. 0) then do i=1, numprocs-1 call MPI_SEND_INIT (a, N, MPI_DOUBLE_PRECISION, i, 0, MPI_COMM_WORLD, irequest(i), ierr) enddo endif … ここで、データを送る if (myid .eq. 0) then do i=1, numprocs-1 call MPI_START (irequest, ierr ) enddo endif /* 以降は、ISENDの例と同じ */ 88 2025年度 計算科学技術特論A
GPU化の実例 FMO法プログラムABINIT-MP 89 2025年度 計算科学技術特論A
FMO法プログラムABINIT-MP 坂倉耕太 特任准教授(大阪大学D3センター)& 望月祐志 教授(⽴教大学理学部)提供 坂倉ほか︓FMOプログラムABINIT-MPのGPUによる高速化、IPSJ第87回全国大会(2025.3.15) 特徴 FMO法(フラグメント分子軌道法) 数万原子規模の巨大分子系にも対応 フラグメント間相互作用エネルギーIFIE 材料系、創薬分野に有益な情報が得られる プログラム特性 MPI/OpenMP 2つの収束計算(SCF,SCC) 計算コスト分布は多様(様々な処理あり) 通信コスト高め(インバランス生じやすい) Covid-19のスパイクタン パク質の水和モデル ⾔語︓Fortran 並列︓MPI、MPI/OpenMP 動作実績︓A64FX、SX-AT、Linux、Windows Foundation for Computational Science 90
ABINIT-MPのコスト分布 坂倉耕太 特任准教授(大阪大学D3センター)& 望月祐志 教授(⽴教大学理学部)提供 FOCK⾏列 システム関連 𝐹 =𝐻 その他 2電子積分 9% 53% 6% 通信関連 ∑, , 𝐶 𝐶 2 𝜇𝜈 𝜆𝜎 2電子積分 𝜇𝜈 𝜆𝜎 𝑑𝒓𝟏 𝑑𝒓𝟐 𝜙 𝒓𝟏 𝜙 𝑟 𝜇𝜆 𝜈𝜎 1 𝜙 𝒓𝟐 𝜙 𝒓𝟐 𝑟 初期軌道係数C計算 8% FOCK⾏列生成 リスト作成 81種類の 2電子積分ルーチン 10% 収束計算(軌道係数C) FOCK⾏列対角化 FC Direct SCF 14% εSC 計算終了 ABINIT-MPのコスト分布 大部分のコストは2電子積分計算とFOCK⾏列⽣成部分 Foundation for Computational Science 91
GPU化イメージ モノマー部分 do SCC-iteration do monomer-Loop <MPI並列> do SCF-ieration do I-Shell do J-Shell <MPI/OpenMP並列> do K-Shell do L-Shell select case(ang-type) 81通りの2電子積分計算 case(pp|pp) docase(ps|ss) ip case(pp|ss) do ip do case(pp|ps) jq do ip do jq case(pp|pp) do kr do ip do jq do kr do ip do ls do jq do kr do ls do jq calc ERI do kr docalc ls ERI do kr docalc ls ERI docalc ls ERI calc ERI 坂倉耕太 特任准教授(大阪大学D3センター)& 望月祐志 教授(⽴教大学理学部)提供 do SCC-iteration do monomer-Loop set index table for GPU sort angluar momentum type ERI do SCF-ieration 21通りの積分タイプに再編 GPU化 do n_pppp !on GPU do n_pppp !on GPU <MPI並列> do n_pppp !on GPU do n_pppp !on GPU IJ<MPI並列> = list() <MPI並列> =list() list() n_pppp !on GPU <MPI並列> KLIJIJ =do = list() = <MPI並列> list() IJ = list() doKLKL ip = list() do ip IJ= =list() list() KL do jq do ip do jq KL = list() ip do kr do jq do kr ip jq do ls do kr do ls jq do kr calc ERI do ls calc ERI do kr do ls calc do lsERI calc ERI calc ERI 軌道角運動量タイプ別に集約した ループ構造に改変 Foundation for Computational Science 92
GPU化施策① OpenACCによるGPU化 坂倉耕太 特任准教授(大阪大学D3センター)& 望月祐志 教授(⽴教大学理学部)提供 do SCC-iteration do monomer-Loop set index table for GPU sort angluar momentum type ERI !$acc data copyin(nsh2atm,nto2shl,fmt_table,dkps,apps,pps,workbuf) do SCF-ieration !$acc data copyin(dc) copy(fc) subroutine gpu_ssss subroutine gpu_ssss !$acc parallel num_workers(2) vector length(16) subroutine gpu_ssss !$acc parallel num_workers(2) vector length(16) !$acc loop gang gpu_ssss worker subroutine !$acc parallel num_workers(2) vector length(16) subroutine gpu_pppp !$acc loop gang worker do !$acc n4 =1,n_pppp_size !$acc parallel num_workers(2) vector length(16) loop gang worker !$acc parallel num_workers(2) vector length(16) do n4 =1,n_pppp_size ish = nslist(1,n4) !$acc loop gang worker do n4 =1,n_pppp_size !$acc loop gang worker ish =nslist(2,n4) nslist(1,n4) jsh = n4 do =1,n_pppp_size ish = nslist(1,n4) do n4 =1,n_pppp_size<MPI> jsh =nslist(3,n4) nslist(2,n4) ksh = ish =nslist(2,n4) nslist(1,n4) jsh = ish = nslist(1,n4) ksh = nslist(3,n4) lshksh = nslist(4,n4) jsh =nslist(3,n4) nslist(2,n4) = jsh =nslist(3,n4) nslist(2,n4) = nslist(4,n4) 〜 lsh ksh =nslist(4,n4) lsh = 〜 ksh= =nslist(4,n4) nslist(3,n4) I,J,K,L軌道シェルループを1重化 〜 lsh 〜 lsh = nslist(4,n4) したループをGPUで計算 〜 Foundation for Computational Science 93
GPU化施策② データ転送 坂倉耕太 特任准教授(大阪大学D3センター)& 望月祐志 教授(⽴教大学理学部)提供 各モノマーのSCF計算の前に GPU用Index配列、積分作業配列をCPU->GPU転送 do SCC-iteration do monomer-Loop set index table for GPU SCF内で変化する電子密度、FOCK⾏列の転送 sort angluar momentum type ERI !$acc data copyin(nsh2atm,nto2shl,fmt_table,apps,workbuf) do SCF-ieration !$acc data copyin(dc) copy(fc) subroutine gpu_pppp subroutine gpu_pppp !$acc parallel num_workers(2) vector length(16) subroutine gpu_pppp !$acc parallel num_workers(2) vector length(16) subroutine !$acc loop gang gpu_pppp worker !$acc parallel num_workers(2) vector length(16) subroutine gpu_pppp loop gang worker !$acc parallel num_workers(2) vector length(16) do!$acc n_pppp !on GPU !$acc loop gang worker parallel num_workers(2) vector length(16) do n_pppp !on GPU worker !$acc loop gang IJ =!$acc list() do n_pppp !on GPU loop IJ =list() list() do n_pppp !ongang GPU worker KL =!$acc <MPI並列> do n_pppp !on GPU = list() doKLIJ ip IJ =list() list() = do ip IJ= =list() list() KL do jq KL = list() do KL jq ip= list() SCC収束ループ、モノマールー dododo ipkr ip kr jq do ls do do jq ls jq プ、モノマー収束ループ内での do krERI calc do calc kr do kr ERI do ls 最適なデータ転送が必須 do do ls ls calcERI ERI calc calc ERI Foundation for Computational Science 94
結果 性能評価 1CPUコア比較 Wisteria-A(Aquarius) CPU:Intel Xeon Platinum 8360Y GPU:NVIDIA A100 Profiler:NSIGHT SYSTEMS ルーチン名 坂倉耕太 特任准教授(大阪大学D3センター)& 望月祐志 教授(⽴教大学理学部)提供 計算条件 FMO2/Chignolin/6-31G/HF Chignolin︓10残基(138原子) (データ規模は小さいが、フラグメントサイズ大) CPU1core (秒) CPU1core+1GPU (秒) - 9.2 set_nshtable 備考 INDEXテーブル作成 direct_scf_gmat 2198.2 33.7 x65.22電子積分+FOCK生成 monomer_esp_ele 125.9 2.7 モノマー環境静電ポテンシャル dimer_esp_ele 39.6 0.5 ダイマー環境静電ポテンシャル dimer_oneint 9.2 9.1 ダイマー1電子積分(非GPU化) others 21.2 19.4 Total 2394.1 74.6 x32.1 GPU化した「2電子積分+FOCK⽣成」は60倍強の高速化 Foundation for Computational Science 95
大規模機械学習への展開 96 2025年度 計算科学技術特論A
大規模機械学習とGPUスパコン 現在、AIスパコンとして、GPUを大量に搭載したスパコン が産学で導入されている 特に大規模機械学習モデルを生成するには、1ノード内 のGPUではメモリサイズと実行時間加速が不十分 →多数のGPUノードを使った分散機械学習が必須 ☞MPIによる、分散機械学習の実行 そのため、機械学習(特に深層学習)を MPIで分散して並列実行できるフレームワーク の開発が鍵になっている 97 2025年度 計算科学技術特論A
Megatron-LM [1] https://github.com/NVIDIA/Megatron-LM Megatron-LMは、NVIDIA社が開発した大規模言語モデル (LLM)向け分散学習フレームワーク GPT、BERT、T5などTransformerベースのモデルを効率的に学習 数千億パラメータを持つモデル、複数ノードGPU環境(GPUスパ コン)での分散実行をサポート 図 GPT-3 model (175 billion parameters) の 96台から 4608台の NVIDIA H100 GPUでの性能スケーリング (図の出典[1]) 98 2025年度 計算科学技術特論A
機械学習モデルの進化 フレームワークの変遷[2] 2019年:Megatron-LM (NVIDIA) 2020年: DeepSpeed (Microsoft) 2021年: Megatron-DeepSpeed (Microsoft) 2024年: Megatron-DeepSpeed (NVIDIA(llmjp[3])) Megatron-LMでTransformerモデルの学習を、 テンソル並列性 や パイプライン並列性 を用いて並列化 DeepSpeedのZeRO Optimizerでメモリ効率を大幅に向上 その後、両者が融合したフレームワークに [2]Megatron-LMの概要と各種パラメータについて(10/27日勉強会公開用) https://zenn.dev/matsuolab/articles/528c67549c9771 [3] LLM 勉強会 (国立情報学研究所 大規模言語モデル研究開発センター (LLM研究開発センター) ) https://llm-jp.nii.ac.jp/ 99 2025年度 計算科学技術特論A
テンソル並列[4] 1. 2. 行列-行列積 Y=X A で、 各行列をデータ分散し て並列実行 ☞ブロック分散 1に加えて、 活性化関数計算を分散 データで行い、行列収 集のコスト(行列データ のgather)を削減 図の出典[5]の図3(b) [4] 大規模モデルを支える分散並列学習のしくみ Part1 (2023/06/22) https://zenn.dev/turing_motors/articles/0e6e2baf72ebbc [5] M. Shoeybi, et al.: Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism, arXiv:1909.08053 [cs.CL] (2020) 100 2025年度 計算科学技術特論A
パイプライン並列[6] 深層学習の各層の処理 を、GPU分散する 1つの処理(ミニバッチ)で は、並列の効果が無い 同時実行可能な処理に さらに分割(ミニバッチ→ マイクロバッチ)し、連続 投入することで、並列処 十分な時間が経つと 理する 最大並列数で実⾏ ☞パイプライン処理 図の出典[6] [6] Y. Huang: Introducing GPipe, an Open Source Library for Efficiently Training Large-scale Neural Network Models (2019) https://research.google/blog/introducing-gpipe-an-open-source-library-for-efficiently-training-largescale-neural-network-models/ 101 2025年度 計算科学技術特論A 時間
「不⽼」TypeIIサブシステム(V100x4/ノード)での Megatron-LMによる事前学習 椋木大地 助教(名古屋大学情報基盤センター)提供 ソフトウェア megatron_core-0.2.0 CUDA 12.8 PyTorch 25.01 実⾏例 学習モデル︓GPT2-medium(345M parameters) 学習データ︓ArXiv(RedPajama-Data-1T, 28B tokens) elapsed time per iter (ms) 1反復あたりの実行時間 102 15000 10248.9 10000 3.59x 5000 2851.2 7.26x 11.9x 1411.5 858.1 20.3x 504.8 0 4 16 32 64 Number of GPUs 128 Checkpoint Save GB: 4.968, GB/Sec: 0.86, Latency(second): 5.81 (min, max) time across ranks (ms): save-checkpoint ................................: (5810.02, 5810.07) iteration 1800/ 5000 | consumed samples: 921600 | consumed tokens: 943718400 | elapsed time per iteration (ms): 856.4 | learning rate: 1.492E-04 | global batch size: 512 | lm loss: 9.779883E+00 | loss scale: 8589934592.0 | grad norm: 0.000 | actual seqlen: 1024 | number of skipped iterations: 0 | number of nan iterations: 0 | samples per second: 597.866 | tokens per gpu per second (tgs): 9565.858 | TFLOPs: 23.18 | -----------------------------------------------------------------------------------------------validation loss at iteration 1800 | lm loss value: 9.717032E+00 | lm loss PPL: 1.659792E+04 | -----------------------------------------------------------------------------------------------saving checkpoint at iteration 1800 to checkpoints_64 successfully saved checkpoint at iteration 1800 to checkpoints_64 Checkpoint Save GB: 4.968, GB/Sec: 0.78, Latency(second): 6.395 (min, max) time across ranks (ms): save-checkpoint ................................: (6394.62, 6394.68) iteration 1900/ 5000 | consumed samples: 972800 | consumed tokens: 996147200 | elapsed time per iteration (ms): 875.9 | learning rate: 1.491E-04 | global batch size: 512 | lm loss: 9.761699E+00 | loss scale: 8589934592.0 | grad norm: 0.000 | actual seqlen: 1024 | number of skipped iterations: 0 | number of nan iterations: 0 | samples per second: 584.564 | tokens per gpu per second (tgs): 9353.025 | TFLOPs: 22.66 | -----------------------------------------------------------------------------------------------validation loss at iteration 1900 | lm loss value: 9.693572E+00 | lm loss PPL: 1.621305E+04 | -----------------------------------------------------------------------------------------------saving checkpoint at iteration 1900 to checkpoints_64 num of iters lm loss lm loss PPL successfully saved checkpoint at iteration 1900 to checkpoints_64 Checkpoint Save GB: 4.968, GB/Sec: 0.86, Latency(second): 5.763 (min, max) time across ranks (ms): 100 9.151689E+00 save-checkpoint ................................: (5763.32, 5763.40) 9.430351E+03 iteration 2000/ 5000 | consumed samples: 1024000 | consumed tokens: 1048576000 | elapsed time per iteration (ms): 860.3 | learning rate: 1.490E-04 | global batch size: 512 | lm loss: 9.745195E+00 | loss scale: 3000 2.924883E+00 1.863205E+01 17179869184.0 | grad norm: 0.000 | actual seqlen: 1024 | number of skipped iterations: 0 | number of nan iterations: 0 | samples per second: 595.108 | tokens per gpu per second (tgs): 9521.721 | TFLOPs: 23.07 | -----------------------------------------------------------------------------------------------10000 1.993112E+00 7.338338E+00 validation loss at iteration 2000 | lm loss value: 9.679343E+00 | lm loss PPL: 1.598400E+04 | -----------------------------------------------------------------------------------------------8.702555E+00 saving checkpoint50000 at iteration 2000 to2.163617E+00 checkpoints_64 successfully saved checkpoint at iteration 2000 to checkpoints_64 Checkpoint Save GB: 4.968, GB/Sec: 0.84, Latency(second): 5.915 (min, max) time across ranks (ms): save-checkpoint ................................: (5915.01, 5915.13) lm loss (language model loss)︓モデルの予 iteration 2100/ 5000 | consumed samples: 1075200 | consumed tokens: 1101004800 | elapsed time per iteration (ms): 862.9 | learning rate: 1.489E-04 | global batch size: 512 | lm loss: 9.730757E+00 | loss scale: 測の正しさ.小さいほど良い.モデルによるが 17179869184.0 | grad norm: 0.000 | actual seqlen: 1024 | number of skipped iterations: 0 | number of nan 1.0-2.0が望ましい. iterations: 0 | samples per second: 593.323 | tokens per gpu per second (tgs): 9493.167 | TFLOPs: 23.00 | -----------------------------------------------------------------------------------------------lm loss (Perplexity)︓モデルがどれだけ困 validation lossat iteration 2100PPL | lm loss value: 9.660802E+00 | lm loss PPL: 1.569036E+04 | -----------------------------------------------------------------------------------------------惑しているか.値が小さいほどモデルの予測が確 saving checkpoint at iteration 2100 to checkpoints_64 successfully saved checkpoint at iteration 2100 to checkpoints_64 実.ケースによるが通常10以下が望ましい. Checkpoint Save GB: 4.968, GB/Sec: 0.86, Latency(second): 5.795 (min, max) time across ranks (ms): save-checkpoint ................................: (5795.11, 5795.15) iteration 2200/ 5000 | consumed samples: 1126400 | consumed tokens: 1153433600 | elapsed time per iteration (ms): 858.1 | learning rate: 1.488E-04 | global batch size: 512 | lm loss: 9.724328E+00 | loss scale: 17179869184.0 | grad norm: 0.000 | actual seqlen: 1024 | number of skipped iterations: 0 | number of nan iterations: 0 | samples per second: 596.692 | tokens per gpu per second (tgs): 9547.071 | TFLOPs: 23.13 | -----------------------------------------------------------------------------------------------validation loss at iteration 2200 | lm loss value: 9.662595E+00 | lm loss PPL: 1.571852E+04 | ------------------------------------------------------------------------------------------------ 実⾏画⾯(名大スパコン「不⽼」TypeII サブシステム16ノード実⾏(64GPU)
レポート課題(その1) 問題レベルを以下に設定 問題のレベルに関する記述: •L00: きわめて簡単な問題。 •L10: ちょっと考えればわかる問題。 •L20: 標準的な問題。 •L30: 数時間程度必要とする問題。 •L40: 数週間程度必要とする問題。複雑な実装を必要とする。 •L50: 数か月程度必要とする問題。未解決問題を含む。 ※L40以上は、論文を出版するに値する問題。 教科書のサンプルプログラムは以下が利用可能 付属のサンプルプログラム全てが利用可能 103 2025年度 計算科学技術特論A
レポート課題(その2) 1. 2. 3. 4. [L5] MPIにおけるブロッキングは、必ずしも同期でないこと を説明せよ。 [L10] MPIにおけるブロッキング、ノンブロッキング、および 通信モードによる分類に対応する関数を調べ、一覧表に まとめよ。 [L15] 利用できる並列計算機環境で、ノンブロッキング送信 (MPI_Isend関数)がブロッキング送信(MPI_Send関数)に対 して有効となるメッセージの範囲(N=0~適当な上限)につ いて調べ、結果を考察せよ。 [L20] MPI_Allreduce関数 の<限定機能>版を、ブロッキン グ送信、およびノンブロッキング送信を用いて実装せよ。さ らに、その性能を比べてみよ。なお、<限定機能>は独自 に設定してよい。 104 2025年度 計算科学技術特論A
レポート課題(その3) 5. 6. 7. 8. 9. [L15] MPI_Reduce関数を実現するRecursive Halving アルゴリズムについて、その性能を調査せよ。この際、 従来手法も調べて、その手法との比較も行うこと。 [L35] Recursive Halvingアルゴリズムを、ブロッキング送信/ 受信、および、ノンブロッキング送信/受信を用いて実装せよ。 また、それらの性能を評価せよ。 [L15] 身近の並列計算機環境で、永続的通信関数の性能を 調べよ。 [L10~] 自分が持っているプログラムに対し、ループ分割、 ループ融合、その他のチューニングを試みよ。 [L10~] 自分が持っているMPIプログラムに対し、ノンブロッキン グ通信(MPI_Isend, MPI_Irecv)を実装し、性能を評価せよ。 また永続的通信が使えるプログラムの場合は実装して評価せよ。 105 2025年度 計算科学技術特論A