MatsuLab. Lecture Note/sougouenshu2008
基本木曜日。月曜も15:00以降なら研究室にいるので、質問があったら来てください。
10/9
課題
渡したMPI仕様書を読んで、どういった通信関数があるか調べて簡単にまとめてくること。
主に一対一通信、集団通信の2グループに分かれるが、それぞれに多くの通信関数が提供されているので、関数の特徴をまとめてくること
ヒント
一対一通信
集団通信
XXv、XXwは無視してよい
10/23
前回の課題の確認
MPIを使った並列プログラミング
基本
MPIアプリケーションと、サーバ・クライアント型アプリケーションの違い
MPIプログラムのサンプル: mpi_pi.c
このファイルはモンテカルロ法を用いてPIを計算する、本当に初歩的なMPIプログラム。
MPI関数もMPI_BcastとMPI_Reduceしか用いていず、1関数での通信量も高々4バイト。
mpi_pi.cのコンパイル&実行方法
$ mpicc -c mpi_pi.c $ mpicc -o mpi_pi mpi_pi.o -lm $ $ mpirun -np 2 -machinefile machines ./mpi_pi <- 実行
課題
PrestoIII上のtakizawaのホームディレクトリから今回の演習用プログラムをコピーする。
$ cp -r ~takizawa/sougouenshu/n01 . $ cp ~takizawa/sougouenshu/machines n01
その1 mpi_pi.cにおいて、定数N_POINTSや実行するプロセス数をさまざまに変化させて、実行時間を確認すること。特に、N_POINTSを比較的大きい値に固定したときに、プロセス数を変化させた場合の実行時間を比較すること。
その2
以下の指示に従い「行列とベクトル積を行なうプログラム」を実装し、実行すること。
シングルプロセッサ用プログラムを用意してあるので、それを参考にして良い。
シングルプロセッサ用プログラムのコンパイル&実行方法
$ gcc -c vector.c <- vector.oが既に生成されていれば実行しなくても良い $ gcc -c mul_matrix.c $ gcc -o mul_matrix mul_matrix.o vector.o $ ./mul_matrix <- 実行
MPIプログラム(例 mpi_mm.c)のコンパイル方法
$ gcc -c vector.c <- vector.oが既に生成されていれば実行しなくても良い $ mpicc -c mpi_mm.c $ mpicc -o mpi_mm mpi_mm.o vector.o $ mpirun -np 4 -machinefile machines ./mpi_mm <- 実行
行列・ベクトル積問題の補足
その1 /home/takizawa/sougouenshu 以下に「sample1.c」、「sample2.c」と言う名前でプログラム実装例を置いた。 sample1.cは行列データ送信時にMPI_Scatterを用いる実装で、sample2.cはそのまま全データをMPI_Bcastで送信するアホな実装。 どちらの実装も、行列・ベクトル積を行なう回数は同じ。 10000x10000行列で、800MBのサイズの問題である。
ためしに4プロセスで実行したところ、
sample1 | 10.406秒 |
sample2 | 61.827秒 |
となった。 計算処理を分割しただけでは不十分で、処理対象データの転送にも気を配らないと性能が出ないことが理解できると思う。
その2 sample1.cをプロセス数を1,2,4と変化させて実行したところ、次のよう実行時間が変化した。
1 | 2.914 |
2 | 4.994 |
4 | 10.406 |
計算処理を分割しているから、プロセス数を増やせば各プロセスが担当する計算が減るため実行時間も短くなるはず・・・だが、むしろ増えている。 この理由は、計算コストに対して通信コストが高すぎるため。 実際にMPIでプログラムを書くときには、大きな通信コストを払ってでも分割する価値のある問題かどうか考えてから書くべきである。
また、問題によってはプロセス数を変化させた場合、ある程度まで増やせば実行時間が短縮されるが、それ以上増やすと逆に実行時間が増加するものもある。 ある程度までであれば、計算コストが通信コストを上回り、問題を分割することでプロセスあたりの処理量を減らし性能向上するが、それ以上にプロセスを増やすと通信コストが計算コストを上回ることになり、sample1.c同様に通信に多くの時間が取られ、性能低下する。 このトレードオフを見極め、問題に対して適切なプロセス数を捜し出すことが重要となる。
N体問題
N体問題の基礎問題をMPIを用いてC言語で実装する。
N体問題では、N個の質点間における相互作用の力を解くことによって、例えば宇宙空間に散らばる惑星間の引力、物質を構成する分子間の引力のシミュレーション等を行なう。
末尾の参考文献に、N体問題を理解するためのオンラインデモと重力ゲームへのリンクを載せたのでそちらも参考に。
今回解いてもらうのはスパコンコンテスト2001で出題された問題である。 細かい問題の内容はこちらのページを参考。
MPIを用いていない、C言語だけで書かれたシングルプロセス用のプログラムとデータファイルを以下の場所に置いたので、自分の作業ディレクトリにコピーすること。このページにも添付してある。
$ cd sougouenshu $ cp ~takizawa/sougouenshu/n-body.tar.gz . <- 「.」を忘れない $ tar zxf n-body.tar.gz <- 圧縮ファイルの展開 $ cd n-body $ ls correct_data_0.c correct_data_1.c main.c problem.c random_generator.c
このプログラムは以下のようにコンパイル、実行できる。
$ gcc -c *.c <- 拡張子が「.c」のファイルを全てコンパイル $ gcc -o main *.o -lm <- 注1 $ ./main 0 <- 実行 注2
MPIで実装するにはmain.cだけを編集すればよい。以下のような手順でコンパイルすることになる。
$ gcc -c correct_data_0.c correct_data_1.c problem.c random_generator.c <- 注3 $ mpicc -c main.c $ mpicc -o mpi_main *.o -lm $ mpirun -np 32 -machinefile machines ./mpi_main
ヒント
$ man 3 floor $ man 3 fflush
作業には基本的にターミナルを使用する
$ ssh USERNAME@nimbus.m.gsic.titech.ac.jp
$ rsh pad041
$ scp mpi.c USERNAME@nimbus.m.gsic.titech.c.jp:
$ scp mpi.c USERNAME@nimbus.m.gsic.titech.c.jp:sougouenshu/n01
PrestoIIIへのアクセス権は今期いっぱいしか与えられないので、第1ラウンドが終わった後、忘れないうちに以下の手続きに従い各自のデータをバックアップすること。
$ ssh USER@nimbus.m.gsic.titech.ac.jp
$ tar zcf sougouenshu.tar.gz sougouenshu
$ scp USER@nimbus.m.gsic.titech.ac.jp:sougouenshu.tar.gz .
$ tar zxf sougouenshu.tar.gz