プログラミング基礎

① コンパイラの選定
目的 : 収束不良や発散時にソースレベルでデバッグしやすくする。

選定理由

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. 計算強度を確認

コメント

タイトルとURLをコピーしました