//!!edit-lock!!
[[MatsuLab. Lecture Note/sougouenshu2007]]

*第1ラウンド解説 [#daa36b6d]
#contents

**日程 [#oa31bb6b]
基本木曜日。月曜も研究室にいるので、質問があったら来てください。

11/1(木)15:00〜松岡先生が研究室の紹介をしてくださる予定です。

**第1回目 [#rac5508b]
10/4

''課題''~
渡したMPI仕様書を読んで、どういった通信関数があるか調べて簡単にまとめてくること。
主に一対一通信、集団通信の2グループに分かれるが、それぞれに多くの通信関数が提供されているので、関数の特徴をまとめてくること

''ヒント''~
一対一通信
-同期通信(ブロッキング通信)
-非同期通信(ノンブロッキング通信)

集団通信
-全対全
-一対多、多対一通信
-Reduction操作

**第2回目 [#ta9f8be7]
10/11

''課題確認''

クイズ
-同期通信、非同期通信はなぜ分類されているのか
-非同期通信だと何がうれしいか
-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  <- 実行

''課題''~

''その1''
mpi_pi.cにおいて、定数N_POINTSや実行するプロセス数をさまざまに変化させて、実行時間を確認すること。

''その2''
以下の指示に従い「COLOR(BLUE){行列とベクトル積を行なうプログラム}」を実装し、実行すること。
シングルプロセッサ用プログラムを用意してあるので、それを参考にして良い。

-行列、ベクトルデータの生成は1つのプロセス上で行い、そのプロセスからMPI通信関数を呼び出して他のプロセスに送ること
-計算終了後には1つのプロセスにデータを集約すること
-行数、列数、使用プロセス数をさまざまに変化させて実行すること
-一対一通信のMPI_Send、MPI_Recvだけで実装できるが、集団通信のMPI_Bcast、MPI_Scatter、MPI_Gatherなどを使って実装すると良い
--なお、任意の数のプロセスに対応するには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   <- 実行


**課題の進め方 [#s7ceb180]
その1
-演習室MACでプログラムを編集
-scpコマンドでプログラムをPrestoIIIクラスタに転送(リモートコピー)
-sshコマンドでPrestoIIIにログイン
-PrestoIII上でプログラムをコンパイル&実行

その2
-sshコマンドでPrestoIIIにログイン
-PrestoIII上でviやemacs( -nw)などでプログラムを編集、コンパイル&実行


**松岡研PCクラスタPrestoIIIの使い方 [#t8bbbfb5]
作業には基本的にターミナルを使用する
-ログイン
++ログインノードnimbus.titech.hpcc.jpへログイン
 $ ssh USERNAME@nimbus.titech.hpcc.jp
++実行マシンへログイン
 $ rsh pad017
-ファイルの転送(リモートコピー)
--以下のコマンドを用いて、カレントディレクトリにあるファイルmpi.cをnimbus.titech.hpcc.jpに転送
 $ scp mpi.c USERNAME@nimbus.titech.hpcc.jp:
--最後の「:」を忘れない
-使用するマシン
--16台(最大32CPU)
--どのマシンを使用するかは、/home/USERNAME/sougouenshu/machinesファイルを参考に


**参考文献 [#o65101c7]
+[[MPIドキュメント集:http://www.mpi-forum.org/docs/docs.html]]
--初回配布資料は、この文献の前半部分(140ページまで)
+[[TSUBAMEの構成:http://www.gsic.titech.ac.jp/~ccwww/tgc/]]
+[[MPIによる並列プログラミングの基礎(PDF):http://mikilab.doshisha.ac.jp/dia/smpp/cluster2000/PDF/chapter02.pdf]]
--同志社大の先生が書かれた、非常に詳しい日本語資料

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS