① コンパイラの選定
目的 : 収束不良や発散時にソースレベルでデバッグしやすくする。
選定理由
Microsoft Visual Studio 2022
GUI デバッガが充実しており、ブレークポイント・変数ウォッチが容易。
oneAPI プラグインが公式サポート。
Intel oneAPI Fortran Compiler (ifx/ifort)
/debug オプションで最適化を抑制したまま詳細デバッグ可能。
-parallel, -par-report で自動並列化をオン・レポート取得。
既存 F77/F90 資産をそのまま利用できる。
#### ② 並列化方式の選択
手動並列化 vs. 自動並列化
評価軸 手動 (OpenMP 指示子を全て記述) 自動 (コンパイラ任せ)
保守性 ループ変更ごとに指示子更新が必要 既存コードをほぼ修正せずに済む
ユーザー利便性 並列化知識が必須 オプション指定のみ
性能チューニング余地 最大 依存性が解決できない箇所は並列化されない
結論 : 初期版は 自動並列化 を採用し、性能ボトルネックが残った箇所にのみ限定的に OpenMP 指示子を投入してチューニングする “ハイブリッド” 戦略とする。
#### ③ 並列化の要点
ホットループの特定
反復ループが 20 以上・行列サイズも異なる。
全ループ並列化は却って遅くなる恐れ。
-par-report3(自動レポート)+ VTune/Advisor で 各ループの実行時間 を取得し、 並列効率 > 30 % のループを優先。
ループ入れ子の最適配置
格子定義:i = 周方向,j = 軸方向,k = 径方向。
最外周 → 軸方向 (j) を分割
j 本数が最も多く負荷分散しやすい。
内側に i を置くと Fortran の連続メモリアクセスでキャッシュ効率が高い。
並列領域のオーバーヘッド削減
反復ごとに !$OMP PARALLEL を生成せず、
fortran
コピーする
編集する
!$OMP PARALLEL DEFAULT(shared) …
DO WHILE (.NOT.converged)
!$OMP DO COLLAPSE(3)
… ! 主要計算
!$OMP END DO
!$OMP SINGLE ! 収束判定 & 変数更新
…
!$OMP BARRIER
END DO
!$OMP END PARALLEL
並列領域は 一度だけ確立 し、各ステップは内部で DO 句を切り替える。
使用する主な OpenMP ディレクティブ/句
ディレクティブ / 句 役割 (要約)
!$OMP PARALLEL スレッドチーム生成(領域を一回だけ作成)
!$OMP DO / COLLAPSE(n) ループ反復の分配 / 多重ループを一本化
PRIVATE(var) / SHARED(var) 変数のスレッドローカル化 / 共有化
SCHEDULE(STATIC[,chunk]) 均等割り当てで負荷分散・オーバーヘッド最小
BARRIER すべてのスレッドを同期
SINGLE 1 スレッドだけが実行(収束判定など)
環境変数 OMP_NUM_THREADS 実行時スレッド数の外部指定
#### 付録 : 推奨ビルド/実行フロー
ビルド
bash
コピーする
編集する
ifx -O3 -parallel -par-report3 -qopenmp -g -traceback source.f90
実行
bash
コピーする
編集する
set OMP_NUM_THREADS=8 # Windows 例
./a.exe
プロファイル
Intel VTune σ:ホットループとスレッド効率を計測
Advisor Roofline:メモリ帯域 vs. 計算強度を確認
プログラミング基礎

コメント