並列処理(SCore)
並列処理(SCore)
自分はSCOREを用いて並列処理を行おうとしている初心者です。
[環境]
・CPU
Intel Core2 Quad 2.83GHz
・メモリ
8GB
・スイッチングハブ
FXG-08IMB(ギガビット)
これをサーバー兼計算ホスト1台、計算ホスト3台の計4台でSCoreによって並列環境として接続しました。
・使用したプログラムは、初期値を設定し、ラプラス方程式を逐次的に計算させるプログラムです。
・並列処理を行うためのプログラムとして、MPIを使用しました。
いろいろなパターンでプログラムを実行した結果を図に貼り付けておきます。
クアッドコアなので、1PCで4ノード扱うことができています。
やや頭でっかちとなってしまいましたが、ここからが質問です。
[質問?]
たとえば、1つのPCで、4ノードで並列処理を行った場合と、
4つのPCで各1ノードずつ、合計4ノードで並列処理を行った場合に、
4PCで1ノードずつを並列接続したほうが"約1.8倍"の演算性能を誇っているのはなぜでしょうか?
[質問?]
今回は初期値を設定して、ラプラス方程式を解く逐次プログラムを使用しましたが、
プログラムによっては、質問?のような結果にならない場合もあるのでしょうか?
もしあるなら、どのようなタイプのプログラムなら、1台で4ノード、4台で4ノードの演算性能がほとんど同じ程度になるのでしょうか?
できれば、?も?も上記した環境を踏まえて回答していただけると幸いです。
申し訳ありませんが、初心者ということを分かって回答していただけると助かります。
面倒だとは思いますが、回答よろしくおねがいします。
[以下プログラム]
この逐次プログラムをMPI関数によって並列処理可能にしたものが実際使用したプログラムです。
(文字数が足りなかったので、並列化する前の逐次プログラムをせめて載せておきます。)
#include<math.h>
#include<stdio.h>
#include<sys/time.h>
#define SIZE (1024*3 - 2)
#define EPS 1.0e-1
double u[SIZE+2] [SIZE+2], uu[SIZE+2][SIZE+2];
double second()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec + tv.tv_usec / 1000000.0;
}
void init(double u[SIZE+2][SIZE+2])
{
int i,j;
memset (u,0,sizeof(double)*(SIZE+2)*(SIZE+2));
for (i=1;i<=SIZE;i++)
for(j=1;j<=SIZE;j++)
u[i][j]=sin((j-1)/(SIZE*M_PI))+cos((j-1)/(SIZE*M_PI));
}
int main()
{
double start,time,err;
int i,j,iter=0;
init(u); init(uu);
start=second();
do{
{iter ++;}
for(i=1;i<=SIZE;i++)
for(j=1;j<=SIZE;j++)
uu[i][j]=u[i][j];
for(i=1;i<=SIZE;i++)
for(j=1;j<=SIZE;j++)
u[i][j]=(uu[i-1][j]+uu[i+1][j]+uu[i][j-1]+uu[i][j+1])/4.0;
{err=0.0;}
for(i=1;i<=SIZE;i++)
for(j=1;j<=SIZE;j++)
err+=(uu[i][j]-u[i][j])*(uu[i][j]-u[i][j]);
}while (err>EPS);
time = second()-start;
printf("time=%f seconds, iteration=%d,performance=%f MFLOPS\n",
time,iter,(8.0*SIZE*SIZE*iter)/time/1.0e6);
return 0;
}