MatsuLab. Lecture Note/sougouenshu2008
第1ラウンド解説 †
日程 †
基本木曜日。月曜も15:00以降なら研究室にいるので、質問があったら来てください。
第1回目 †
10/9
課題
渡したMPI仕様書を読んで、どういった通信関数があるか調べて簡単にまとめてくること。
主に一対一通信、集団通信の2グループに分かれるが、それぞれに多くの通信関数が提供されているので、関数の特徴をまとめてくること
ヒント
一対一通信
- 同期通信(ブロッキング通信)
- 非同期通信(ノンブロッキング通信)
集団通信
- 同期
- 全対全
- MPI_Alltoall、MPI_Allgather
- 一対多、多対一通信
- MPI_Bcast、MPI_Gather、MPI_Scatter
- Reduction操作
- MPI_Reduce、MPI_Allreduce、MPI_Reduce_scatter
XXv、XXwは無視してよい
第2回目 †
10/23
前回の課題の確認
- ブロッキング通信と、ノンブロッキング通信の両方がある理由
- ブロッキング通信だと通信中にCPUがアイドル(使用されない状態)になる。特にサイズの大きい配列データなどを送受信する場合には、そのアイドル時間も大きくなり、その分のCPU時間が無駄になる。ノンブロッキング通信では、CPUでの計算と通信をオーバーラップさせることでCPUを有効活用する。
- 現状のMPIでは集団通信はすべてブロッキングだが、研究レベルではノンブロッキングのものもある。
- なんのために集団通信は用意されているか
- MPIが提供する集団通信と同じパターンの通信は、MPIを使ったプログラムを書く人が一対一通信を組み合わせることで実現可能である。
- 集団通信を高速に実行するには賢いアルゴリズムを使う必要があり、一般のプログラマーには実行が困難である。実際、集団通信の実装によって、通信時間がプロセス数に対してO(n)だったり、O(logn)となったり、通信されるデータ量もO(n)からO(logn)へと減らすことが可能である。MPIが提供する集団通信はデータサイズやプロセス数に応じて適したアルゴリズムを使用するように調整されている。
MPIを使った並列プログラミング
基本
- 分散メモリモデルのプログラミングモデル
- プロセス(マシン)間でデータは共有されないので、明示的なデータの送受信が必要
- <-> 共有メモリモデル
- 処理対象のデータ、問題を細かく分割し、多くのコンピュータに配分・実行させる
- 通信量を出来るだけ少なくするように工夫
- 計算量と通信のバランスも考える必要がある
- マシン性能に応じて配分する問題サイズを変えること(負荷分散)も重要だけど、今回使用するマシンの性能はほぼ等しいので省略
MPIアプリケーションと、サーバ・クライアント型アプリケーションの違い
- サーバ・クライアント型
- 一般にサーバとクライアントアプリケーションは異なるプログラム(MPMD: Multiple Program Multiple Data)
- WebサーバとWebブラウザ、ファイルサーバとクライアント(専攻の演習マシン)
- MPI並列アプリケーション
- 全てのプロセス(マシン)が同じプログラムを実行、ただし、処理対象データは異なる(SPMD: Single Program Multiple Data)
- もちろん、MPIライブラリを用いてサーバ・クライアント型アプリケーションも書ける
MPIプログラムのサンプル: mpi_pi.c
このファイルはモンテカルロ法を用いてPIを計算する、本当に初歩的なMPIプログラム。
MPI関数もMPI_BcastとMPI_Reduceしか用いていず、1関数での通信量も高々4バイト。
- MPIアプリケーションはMPI_Init関数で始まり、MPI_Finalize関数で終わる
- MPI_Comm_sizeで、アプリケーション実行に参加しているプロセス数を得る
- MPI_Comm_rankでMPIアプリケーション内での自分(プロセス、マシン)の名前を得る
- 名前の範囲は0〜N_PROCS-1
- 具体的に4つのプロセスでアプリケーションを実行する場合には、0,1,2,3といった名前が割り当てられる
- 一対一通信ではこの名前で通信先プロセスを指定する
- MPI_Bcastで分割した問題を各プロセスに送信
- プロットする点の数をばらまく
- 実はこのサンプルではMPI_Bcastする必要は無い
- MPI_Reduceで各プロセスの計算結果を1つのプロセスに集約
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
以下の指示に従い「行列とベクトル積を行なうプログラム」を実装し、実行すること。
シングルプロセッサ用プログラムを用意してあるので、それを参考にして良い。
- 行列、ベクトルデータの生成は1つのプロセス上で行い、そのプロセスからMPI通信関数を呼び出して他のプロセスに送ること
- 計算終了後には1つのプロセスにデータを集約すること
- 一対一通信のMPI_Send、MPI_Recvだけで実装できるが、集団通信のMPI_Bcast、MPI_Scatter、MPI_Gatherなどを使って実装すると良い
- 特定のパターンのプロセス数で実行できればよい。たとえば、1,2,4,8,16と2べきの数のプロセスでしか実行できなくてもかまわない。
- 任意の数のプロセスに対応するにはMPI_Scatter、MPI_Gatherの変わりに、MPI_Scatterv、MPI_Gathervを使うことになる
- 行数、列数、使用プロセス数をさまざまに変化させて実行すること
シングルプロセッサ用プログラムのコンパイル&実行方法
$ 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 <- 実行
課題の進め方 †
- 演習室MACでプログラムを編集
- scpコマンドでプログラムをPrestoIIIクラスタに転送(リモートコピー)
- sshコマンドでPrestoIIIにログイン
- PrestoIII上でプログラムをコンパイル&実行
松岡研PCクラスタPrestoIIIの使い方 †
作業には基本的にターミナルを使用する
- ログイン
- ログインノードnimbus.m.gsic.titech.ac.jp (131.112.28.30)へログイン
$ ssh USERNAME@nimbus.m.gsic.titech.ac.jp
- 実行マシンへログイン
$ rsh pad041
- ファイルの転送(リモートコピー)
- 使用するマシン
- 20台(最大80CPU)
- どのマシンを使用するかは、/home/USERNAME/sougouenshu/machinesファイルを参考に
- マシンは故障することがあるので、プログラムを実行できないなど、問題があったら連絡するように
PrestoIII上のデータのバックアップ方法 †
PrestoIIIへのアクセス権は今期いっぱいしか与えられないので、第1ラウンドが終わった後、忘れないうちに以下の手続きに従い各自のデータをバックアップすること。
- nimbus.m.gsic.titech.ac.jpにログイン
$ ssh USER@nimbus.m.gsic.titech.ac.jp
- 総合演習用データのアーカイブ(1つのファイルにまとめること)
$ tar zcf sougouenshu.tar.gz sougouenshu
- このコマンドを実行することにより sougouenshu ディレクトリ以下の全部のファイルを sougouenshu.tar.gz と言う名前の1つのファイルにまとめる
- lsコマンドを実行し、sougouenshu.tar.gzが存在することを確認
- nimbus.m.gsic.titech.ac.jpからログアウト
- MACマシン上でscpを実行し、nimbusからアーカイブファイルをダウンロード
$ scp USER@nimbus.m.gsic.titech.ac.jp:sougouenshu.tar.gz .
- MACマシンからのプログラムファイル転送とは実行方法が違うので注意
- 最後の「.」を忘れない
- ダウンロードできたかどうか、lsで確認
- アーカイブファイルを展開
$ tar zxf sougouenshu.tar.gz
- カレントディレクトリにsougouenshuと言う名のディレクトリが出来るはず
参考文献 †
- MPIドキュメント集
- 初回配布資料は、この文献の前半部分(140ページまで)
- TSUBAMEの構成
- MPIによる並列プログラミングの基礎(PDF)
- スパコンコンテスト2001
- 優勝チームのプログラムも掲載されているので、必要なら参考にして良い
- N体問題オンラインデモ
- N体問題重力ゲーム
- 粒子登録法