・ ・
・
仮想グローバルメモり空間
・ ・
・ クロスバ
メ メ メ メ メ
メモリ メモリ メモリ メモリ メモリ
XPFortran + {自動並列/ OpenMP}
MPI +{自動並列/OpenMP}
1.2 性能チューニングの概要
性能チューニングは,前述のプログラミングモデルのどの部分を対象にするかによって,大きく3種類に分け られます.図1.2に性能チューニングの体系を示します.
図1.2 性能のチューニング体系
プロセス
スレッド クロスバ ノード
・ ・ ・
①スカラーチューニング
②スレッド並列チューニング
③プロセス並列チューニング
性能チューニング
プロセス単体の 性能向上
スレッド並列の 効率改善
プロセス並列の 効率改善 並列
チューニング スカラー チューニング
スレッド並列 チューニング プロセス並列 チューニング
180 宇宙航空研究開発機構研究開発報告 JAXA-RR-10-005
2. 性能チューニングのポイント
性能チューニングの種類ごとのポイントについて,以下に説明します.
2.1 スカラチューニングのポイント
① キャッシュミス率を下げる.
キャッシュメモリは,プロセッサと主記憶の間に置かれた比較的容量の小さな高速メモリです.主記憶 から読み込んだデータをキャッシュメモリに保存することで,同じデータを再び利用する場合に,高速に 読み込むことが可能となります.キャッシュメモリを階層的に組み合わせることにより,主記憶へのアク セスを高速化することができます.キャッシュメモリが有効利用されず,主記憶へのアクセスが発生する ことをキャッシュミスと言います.キャッシュミス率とは実行命令回数に対するキャッシュミス回数の割 合の事です.キャッシュミス率が低いほど,性能としては高くなります.従って,キャッシュミス率を下 げ,性能向上させるには,プログラムのデータアクセスを局所化し,主記憶に対してではなく,キャッシ ュメモリに対して行うことがポイントとなります.
図2.1 CPUとキャッシュメモリと主記憶の関係
② TLBミス率を下げる.
プログラムの命令実行時には,論理的な仮想メモリアドレスから実メモリアドレスへの変換を行うた めに,アドレス変換テーブルを参照します.しかし,アドレス変換テーブルは主記憶上に存在するため,
アクセスには時間がかかります.そこで,高速アクセスするために TLB(アドレス変換バッファ:
Translation Lookaside Buffer)が使用されます.従って,TLBミス率を下げ,性能向上させるには,
仮想メモリアドレスから実メモリアドレスへの変換キャッシュ(TLB)を多用し,主記憶にアクセスせ ずに,高速なアドレス変換をさせることがポイントとなります.なお,大きな配列の全領域に渡ってデ ータアクセスが行われると,TLBミスが多発し,性能劣化する場合があるため注意が必要です.
図2.2 CPUとTLBとアドレス変換テーブルの関係 大容量,低速アクセス
小容量,高速アクセス
大容量,低速アクセス
小容量,高速アクセス CPU
mainTLB
アドレス変換テーブル(メモリ)
TLB CPU
2次キャッシュメモリ
主記憶 1次キャッシュメモリ
2.2 並列チューニングのポイント
●スレッド並列チューニング
・並列化率を上げる
・並列化粒度を上げる
・複数スレッド間のキャッシュ競合を回避する
・ロードバランスを均等化させる
●プロセス並列チューニング
・並列化率を上げる
・並列化粒度を上げる
・ロードバランスを均等化させる
・プロセス間のコストを削減させる
① 並列化率を上げる.
プログラムの並列化対象範囲が少ない状態で並列化部分の性能チューニングを行なっても,アムダール の法則などで言われる通り,あまり性能向上の効果は望めません.
従って,並列化率を上げ,性能向上させるには,並列化対象範囲を拡大し,その他の性能チューニング による性能向上効果を最大限にすることがポイントです.
② 並列化粒度を上げる.
プログラム並列化を行なうことで,並列化処理のための同期処理のオーバヘッドが発生します.
従って,性能向上させるためには,並列化粒度を大きくすることにより相対的にオーバヘッドを小さく することがポイントとなります.
③ 複数スレッド間のキャッシュ競合を回避する.
スレッド並列プログラムでは複数のスレッド間でのキャッシュ競合によりキャッシュミスが発生するこ とがあります.このキャッシュミスが頻繁に発生すると性能が劣化します.
従って性能を向上させるためには,スレッド間のキャッシュ競合を少なくすることが重要になります.
④ ロードバランスを均等化させる.
並列プログラムにおいて,特定のプロセスに負荷の偏りが発生するとそのプロセスの処理時間が長くな り,結果的には,同期処理の時点でプログラム全体の経過時間延伸が発生することになります.
従って,性能向上させるためには,特定プロセスへの負荷集中(ロードバランス)はなるべく均等にな るようにすることがポイントです.
⑤ プロセス間通信のコストを削減する.
並列プログラムにおいて,プロセス間通信は比較的時間のかかる(コストの高い)処理です.
従って,性能向上させるためには,プロセス間通信の回数およびその量を削減したり,演算処理と重ね 合わせるなど,通信コストを削減することがポイントです.
182 宇宙航空研究開発機構研究開発報告 JAXA-RR-10-005
3. 性能チューニングの流れ
性能チューニング作業の流れについて説明します.
性能チューニング作業は以下のフェーズを繰り返して実施することによって行います.
図3.1 性能チューニングの流れ
3.1 性能情報の採取フェーズ
性能情報の採取では,以下の作業を行います.
①プロファイラと呼ばれる性能分析ツールを使用して,プロファイラ情報を採取します.
③ ロファイラ情報から,性能情報を抜き出します.
詳細は「4 性能情報採取」で説明します.
3.2 評価・分析フェーズ
評価では,以下の作業を行います.
①十分に性能が出ているか,後述する性能チューニングの目安値と,性能情報を見比べて評価します.
②十分に性能が出ていると判断されれば性能チューニングは終わりです.性能が出ていないと判断され れば,ソースコード,プロファイラ情報から原因を分析し,性能チューニング作業を行います.
詳細は「5 評価分析手法」で説明します.
3.3 性能チューニング
性能チューニングでは,以下の作業を行います.
①実行の効率化を図ることを目的として,そのソースコードを修正します.修正は情報分析で調べたホ ットスポット(実行時間の多い箇所)に対して行います.
詳細は「6. 性能チューニングパターン」で説明します.
性能情報の採取
性能チューニング
①スカラーチューニング
②並列チューニング プロセス/スレッド
「4. 性能情報採取」参照
評価・分析
「6. 性能チューニングパターン」参照
「5. 評価分析手法」参照
4. 性能情報採取 4.1 プロファイラの概要
性能分析を定量的に行うため有用なツールとして,プロファイラと呼ばれるソフトウェアが提供されていま す.
ここでは,プロファイラの概要について説明します.
なお,プロファイラにはGUI版とコマンドライン版の2種類が提供されていますが,今回はコマンドライン 版をベースに説明します.GUI版については,「プログラミング支援ツール使用手引書」をご参照ください.
(1)機能概要
プロファイラとは,プログラミング支援ツールの性能チューニング機能の一部で,逐次および並列プログラ ムの実行性能解析を支援するツールです. プロファイラには,以下に示す機能があります.
◆ サンプリング方式によるCPU負荷解析
◆ ハードウェアモニタ情報
◆ プロセス間通信データ転送状況
サンプリング方式とは,プログラムの実行中に一定CPU時間間隔で割込みを発生させ,その時のプロセス,スレッド,手 続き,ループおよび行の状況を測定するものです.
ハードウェアモニタ情報とは,プログラムの実行中にハードウェアカウンタで測定するCPUの詳細な性能情報です.
プロセス間通信データ転送状況とは,プロセス並列実行におけるプロセス間通信時間を測定するものです.
(2)動作概要
プロファイラは,ユーザが以下の手順を段階的に行うことにより使用します.
【翻訳】対象プログラムをプロファイラ向けに翻訳し,実行モジュールを作成します.
【実行】対象プログラムを実行し,収集した性能情報をプロファイラ情報ファイルに格納します.
【解析】解析コマンドを起動し,プロファイラ情報ファイルの解析結果を出力します.
184 宇宙航空研究開発機構研究開発報告 JAXA-RR-10-005
4.2 プロファイラによる情報採取手順
コマンドライン版プロファイラで性能情報の解析結果を採取するまでの手順を以下に説明します.
(1)翻訳
プログラムを翻訳するとき,通常の翻訳時オプションに加えて,オプション"-Ktl_trt"を指定してください.
このオプションは,実行ファイルを作成するときに指定する必要があります.
例)f90ns -Uxpf -Ktl_trt test.f90
(2)実行
プロファイラ用の環境変数を設定して,プログラムを実行してください.
主な環境変数の一覧を以下に示します.
表4.1 プロファイラの環境変数
環境変数名 内容
TRT_ENV プロファイラ情報を収集することを指示する.
"PMP=on"を指定する.
PROF_STATS 性能チューニング情報の収集項目を指定する.
コマンドライン版プロファイラの場合,以下の項目の情報を収集可能.
収集する項目(複数指定可能)に対応する値の合計値を指定する.
1 : プロセス間通信情報,ユーザDTU動作情報 2 : ハードウェアモニタ情報
4 : サンプリング情報
256 : PAサービスサブルーチンによるハードウェアモニタ情報
プログラム全体の性能情報をまとめて採取する場合には,7を指定する.
PROF_PA ハードウェアモニタ情報の収集項目を指定する.
指定可能な値は以下の通り(複数指定可能).
sta : CPU時間,実行命令数,命令実行効率,2次キャッシュミス率,浮動小数点 演算命令実行効率,命令main TLBミス率,データmain TLBミス率
性能チューニング指標値の分析を行う場合は"sta"を指定する.
PROF_SAMPINTVAL プロファイラ情報を収集する時間間隔[単位:ミリ秒]を指定する.省略値=10ミリ秒.
実行時間が10分以上の場合は,目安として100(ミリ秒)を指定する.
PROF_MEMORY_SIZE プロファイラの作業領域[単位:KByte]を指定する.
プ ロ フ ァ イ ラ 作 業 領 域 は ,PROF_SAMPINTVAL で 指 定 し た 時 間 間 隔 あ た り 128bytes必要.
実行時間が10~20分の場合は,目安として262144(256MB)を指定する.
一般的な環境変数の指定例は以下の通りです.
TRT_ENV="PMP=on" ;export TRT_ENV
PROF_STATS=7 ;export PROF_STATS
PROF_PA=sta ;export PROF_PA
PROF_MEMORY_SIZE=262144 ;export PROF_MEMORY_SIZE
実行が完了すると,実行時のカレントディレクトリにプロファイラ情報ファイルが作成されます.