MPIの演習課題

2015 年 6 月 11 日
計算科学入門 MPI 演習課題
1
• レポートの提出に関して(締め切り 7 月 23 日,講義中または工学部 2 号館 110 号室に提出)
– レポートには作成したソースコードを必ず添えること.
– 途中まででも,できたところまで,もしくは,方針のみを書いて提出して良い.ソースコードを書いていない部分はで
きるだけ詳しく方針を書くこと.
• プログラムの実行に関して
– 逐次計算のコードには実行時間が 1 分程度のコードも含まれる.
– コンパイルオプションは問わないが,実行する際のプロセス数は 16 以下にすること.
• ソースコードに関して
– 問題 1,問題 2 の逐次計算のコード,ヒントのコードは/home/h/hiroto720sekido/KADAI2015/においてある.
– ファイル名を xxx として,cp /home/h/hiroto720sekido/KADAI2015/xxx ~/でコピーできる.
• その他
– 問題 1 においては,問題文の通りの方針でプログラムを作成せよ.ただし,通信の部分で高速に動作するような工夫が
見られるプログラムには高い点数を与える.
– 問題 2 においては,自由に高速なプログラムを作成せよ.高速化の工夫が見られるプログラムには高い点数を与える.
– 並列化前と並列化後に出力が 大きく 変化した場合は,プログラムにバグを含む可能性がある.並列化前と後の出力を
チェックすること.ただし,出力が変化しなかったからといってバグなく正常に並列化できているとは限らない.
– ヒントのプログラムは必ずしも最善の方法のヒントではない.高得点を狙う場合は更に良い方法がないかを考えること.
問題 1 (2 群の母平均に優位な差があるかを調べる検定)
M −1
N −1
2 群のデータ {X k }k=0
, {Yk }k=0
が与えられた時,それらの母平均に優位な差があるかどうかを調べる Welch の t 検定を考えよう.
それぞれの標本平均 M X , M Y ,および,不偏分散 S X , S Y は
MX =
−1
1 M∑
Xk ,
M k=0
MY =
−1
1 N∑
Yk ,
N k=0
SX =
−1
1 M∑
(X k − M X )2 ,
M − 1 k=0
SY =
−1
1 N∑
(Yk − M Y )2
N − 1 k=0
で定義される.もし,2 群の母平均が等しいと仮定すれば,実数 t , v をそれぞれ
(
)
SY 2
SX
M X − MY
M + N
t=√
, v=
S 2X
S2
SX
SY
+
+ N 2 (NY −1)
M
N
M 2 (M −1)
とすると,この t は自由度 v の t 分布に(近似的に)従うことが知られている.もし,自由度 v が十分に大きいことが確認されれ
ば,t 分布は標準正規分布に十分近いため,t の値は標準正規分布に従うとして良い.
そこで,実際に t の値を計算した時,その値の絶対値が 0 からより離れている確率,つまり P 値は
∫ −|t |
∫ ∞
∫ |t |
2
1 −x 2 /2
1 −x 2 /2
1
dx +
dx = 1 − 2
p e
p e
p e−x /2 dx
−∞
|t |
0
2π
2π
2π
で計算され,この値が予め決めておいた危険率(0.01 や 0.05 など)より小さければ,この 2 群の母平均は等しくないと結論付ける
ことができる.
(1) 先に,t の値が与えられた時に,P 値を計算するプログラムを考えよう.これは,積分
∫ |t |
2
1
p e−x /2 dx
0
2π
の値を計算すればよかったが,ここでは,簡単に積分区間を P 個に分割して,それぞれの区間での積分の値を長方形の面積で
近似し
p
|t |
P∑
−1
2πP
k=0
e−((k+0.5)|t |/P )
2
/2
と計算しよう.この逐次計算のプログラムは ttest1.c または ttest1.f90 であるので,これを MPI を用いて並列化せよ.こ
の問題に対するヒントのプログラムは ttest1_hint.c または ttest1_hint.f90 である.
(2) 次に,データから t , v の値を計算するプログラムを考えよう.ただし,最初にデータはランクが 0 のプロセスしか持っていな
いとする.
n プロセスで計算する場合,次のような方針で計算することにしよう.
計算科学入門 MPI 演習課題
2015 年 6 月 11 日
2
M −1
のデータをだいたい同じサイズの n 個のブロックに分けて,それぞれのブロックを各プロセスに分配する.
– {X k }k=0
∑
– 各ブロックごとに和を取り,その和の和を求め,全プロセスが X k を保持する.M で割ることで,全プロセスが標本平
均 M X を得る.
– 同様に各ブロックごとに (X k − M X )2 の和を求め,とあるプロセスが,その和の和を求め,不偏分散 S X を計算する.
– 全く同様の方法にて,{Yk } に対する標本平均,不偏分散を計算する.
– とあるプロセスが M X , M Y , S X , S Y の値を保持しているはずであるので,t , v を式の通りに計算し,出力する.
この逐次計算のプログラムは ttest2.c または ttest2.f90 であるので,これを MPI を用いて上の方針で並列化せよ.この問
題に対するヒントのプログラムは ttest2_hint.c または ttest2_hint.f90 である.
このような方針で並列化を行うと,計算回数の割に通信量が多く,速くはならないが,それを体験してほしい.ただし,でき
るだけ高速に通信を行うようなプログラムを書いた場合はそれを評価し高得点をつける.
問題 2 (ページランクの計算,この問題の配点は低い.問題 1 を十分に完成させた後に取り掛かること)
2-1. 課題内容: N 個のウェブページに対して,どのページがどのページにリンクを張っているかという関係が与えられた時,各ウェ
ブページのページランクを計算するプログラムを MPI を用いて並列化せよ.ただし,ウェブページの情報はランクが 0 のプロセス
のみが所持しているとする.逐次計算のプログラムは pagerank.c または pagerank.f90 である.
2-2. ページランクの説明: ページランクとは,ウェブページの重要度を表すの指標の 1 つであり,たくさんの良いページからリン
クされているページは良いページであるという理念に基づく.以下では,簡単のために,1 つもリンクを張っていないページはない
ものとする.
最初,各ウェブページは点数として 1 点を持っているとしよう.全てのウェブページが,同時に,そのウェブページが持っている
点数をリンクを張っている先のページに等分配して配る,という行為を無限に続ける.そして,最終的にウェブページが持ってい
る点数を,そのままそのウェブページの点数とすると,上で述べた理念に基づき,ウェブページの重要度の指標となると考えられ
る.ただし,これには問題点がある.収束しない可能性があるのと,リンクされていないウェブページが 0 点になり,その後 0 点
のウェブページのみからリンクされているウェブページも 0 点になる,となり,0 点のウェブページについて優劣がはっきりしなく
なるのである.
そこで,ページランクの定義としては,毎回,点数をリンクを張っている先のページに分配した後,各ページが持っている点数
のうち 100α% だけ徴収し,全てのウェブページに等しく α だけ分配する,という操作を加える.このようにして,最終的に収束す
る点数が,そのウェブページのページランクである.今回の課題では α = 0.15 とする.
2-3. プログラムの説明: 逐次計算のプログラムは,上のページランクの定義に現れる操作を点数が収束するまで繰り返し行い,ペー
ジランクを計算するものである.逐次計算のプログラムでは,リンクに関するデータをランク 0 のプロセスが持つ変数に書き込ん
でいる.各変数の意味を簡単に説明しておく.
(C 言語風の表記を用いるが,Fortran 90 でもほぼ同じである)
• int sumlink は整数で,リンクの総数を表す.
• int numlink[] は整数の配列で,numlink[i] は,ウェブページ i が張っているリンクの数を表す.
• int link[],int from[],int to[] はそれぞれ整数の配列で,link[from[i]],link[from[i]+1],. . .,link[to[i]-1]
がそれぞれウェブページ i がリンクを張っているウェブページの番号を表す.to[i] - from[i] は numlink[i] と等しくなっ
ていて,from[i+1] と to[i] は等しい.
• int link[] はランクが 0 のプロセス以外ではメモリを確保していない.C 言語の場合は malloc など,Fortran の場合は
allocate などを呼び出してメモリを確保してから利用すること.
逐次計算のプログラムでは,全てのウェブページの得点の和を 1 になるように正規化しておき,最後に全ての得点を N 倍してい
る.また,計算誤差を防ぐため,反復のたびに,全てのウェブページの得点の和が 1 になるように正規化している.収束判定の条
件としては,1 回の反復によって変動したウェブページの得点の絶対値の和が 10−14 を下回ったら収束したと見なしている.
2-4. 理論的側面の補足: ウェブページ i から張られているリンクの数を d i としたとき,行列 A = (a i j ) ∈ M n (R) を
ai j

1/d j
=
0
(ウェブページ j がウェブページ i にリンクを張っている)
(ウェブページ j がウェブページ i にリンクを張っていない)
と定義すると, A は確率行列となる.つまり, A の固有値は全て絶対値が 1 以下で,固有値として 1 を持つことがわかる.
(固有値 1
が重複固有値でなければ)この固有値 1 に対する固有ベクトルが 2-2. ページランクの説明で述べた,問題点があると言った方法に
基づくウェブページの点数からなるベクトルになる.
また,行列 E ∈ Mn (R) を,全ての要素が 1/N という行列とすれば,(1 − α)A + αE という行列も確率行列で,この行列の固有値 1
に対する固有ベクトルがページランクということになる.プログラムでは,ページランクの定義通りにシミュレーションして計算
しているが,これは,上の行列に対するべき乗法に他ならない.