- 概要
N*Nの行列A[N][N]に対して、B=A*Aを求めるプログラム
をOpenMPを使って作成し、DualCore以上のプロセッサを
持った計算機で並列処理効果を確認する。
- 実装方法
以下に並列化部分のソースプログラムを示す。
#pragma omp parallel for
for(i = 0; i < N;i++){
#pragma omp parallel for
for(j = 0; j < N;j++){
s = 0.0;
#pragma omp parallel for reduction(+:s)
for(k = 0; k < N; k++)s += A[i][k] * A[k][j];
B[i][j] = s;
}
}
#pragma omp parallel for文によってforループを行列計算計算を並列化し、
#pragma omp parallel for reduction(+:s)文によって∑計算を
並列化し高速化を図る。
ちなみに、行列サイズNは1000とする。
ソースファイル
- 実験結果
実験の結果を以下に示す。
A : スペックの違いによる比較
(a)PC別速度比較
コア数が同じでもかなりのばらつきが見られる。また、コアを8つ搭載したcorai7でも
速度は4倍程度となった。PC1及びPC4はあまり効果が見られなかった。
B : 行列サイズによる比較
(b)行列サイズとの関連性
PCはPC2を使用(スペックは上を参照)行列サイズが小さすぎると、並列化を行う方が時間がかかる
事が分かる。これは、並列化を行うことによる時間短縮分に比べて、並列化を行うがために必要な
処理が大きいことを示す。したがって、並列化を行わない時に比べて時間がかかる。
一方、行列サイズが大きければ大きいほど処理速度が上がるかというとそういう訳でもない。結果は
行列サイズが1000程度で頭打ちとなり、2倍には届かない。これは、並列化を行う為に処理が
いくらか必要になり、処理が増えるためだと考えられる。
C : 並列化スレッド数による比較
(C)並列化スレッド数による違い
PCはPC5を使用(スペックは上を参照)行列サイズは500,1000,2000の3パターンで調べた。
結果、500の場合は理論値と大きくかけ離れる結果となった。これは行列サイズが小さすぎるため
並列化によるメリットが少ないと思われる。また、1000と2000では大した違いはなかった。
また、並列化スレッド数が4を越えてから並列化によるメリットが小さくなり、4倍ぐらいを推移した。
これはCPUのコア数が4のCPUにおいて、ハイパースレッディングによってコア数以上のスレッドを並列化
しているためである。よって、理論上速度の向上は4倍が限界である。結果、4倍付近まで速度の向上は
見られ、CPUの有効活用が確かめられる。