前回の記事からずいぶん間が空いてしまいましたが、ITAの利用方法の補足をちょっと書きます。
traceする区間の設定
ITA *1 は、ありがたいことにMPI_Initすると自動的にinitializeされMPI_Finalize時に勝手にFinalizeしてくれます。つまり何もしなければプログラムの実行開始から終了までの全ての通信をtraceしてくれます。
中身が良く分からないプログラムの解析をする時は、一回全部取ってみるというのも良いのですが、traceで記録される通信が増えるとその分trace結果のファイルサイズが増えます。このような時にはVT_traceoff()とVT_traceon()というAPIを使ってtrace対象の区間を設定することができます。
最初に書いたように、MPI_Initするとtrace区間が始まってしまうので、MPI_Initした直後にVT_traceoff()して、traceを取りたい区間の直前でVT_traceon()、区間を抜けたら再度VT_traceoffという使い方です。
ざっくり書くとこんな感じになります。
#include <mpi.h> #include <VT.h> int main(int argc, char **argv){ MPI_Init(); VT_traceoff(); ・ ・ ・ VT_traceon(); トレースを取りたい処理 VT_traceoff(); ・ ・ ・ MPI_FInalize(); return }
このAPIでtrace区間を絞り込む方法は、ある程度通信の様子を見たい場所が絞り込めている時なんかも有用です。
例えば姫野ベンチで、全体のtrace情報を取るとこんな感じで、大量に通信が発生してるなーとしか見えませんが
iteration loop内で10反復目のみを取ると
こういった形で綺麗に1iteration分の通信が見えます。
姫野ベンチの場合、外側のループは単に同じ処理を繰り返しているだけなのであんまり効果が分からないかもしれませんが iterationが経過するにつれて通信の状況が変わるようなプログラム(粒子法とかPIC法とかAMRとかも)では領域分割がうまく行っている部分を捨てて ある程度問題が発生しそうなところにフォーカスしてトレースを取るといった使い方ができます。
ま、トレース結果のファイルサイズさえ気にしないなら、一旦全部取っておいて後の方のiterationのあたりを狙って拡大表示するという使い方でも見れますが、 実アプリでしかも実運用の規模のデータでとなると、ちょっとハンドリングに苦労する規模になるのでお勧めはできません。
単体版のアプリ
こちらのURLから単体版のアプリをインストールすることもできます。
ITAは(Vtuneとかとの連携機能はあるっぽいですが)基本的にはHPCtoolkitの他のアプリには依存していないので、 スパコンでトレース情報を取って、トレースファイルを手元のPCに持って帰ってきて見るような使い方であれば、単体版の方が良いかもしれません。
ちなみに、前回の記事で紹介したHPC toolkitのdockerコンテナは23GB、ITAのインストールサイズは(windows版の場合)だいたい80MBなので200倍以上容量の節約になります。(ま、mac版が無いんでdockerを使ったわけですが・・・)