• 締切済み

MPIによる並列処理

MPICH2を使ってCプログラムの並列処理を行おうとしております。 1台のPCを使用してPC内部の4つのコアで並列処理をさせようとしております。 http://pccluster.web.fc2.com/MPI.html のページを参考にMPICH2のインストールを行い、 mpdboot ~でMPIの起動、プログラムの並列実行は行えたのですが、 ~/mpd.hostsに PCのIP:4 を書き込み、mpdboot -n 1 -f mpd.hostsで起動し、 mpiexec -n 1 xxx.cpp を実行した場合、 n=1より2、3、4の場合のほうが速くはなるのですが、2の場合が4より速くなってしまいます。 これは何かがボトルネックになっていると考えられるのでしょうか? また、mpd.hostsのファイル内で「:4」として1台のPCですが4つのコアがあると指定しているにも関わらず、実行するときに mpiexec -n 5以上の数字 xxx.cpp という指定したコア数以上での実行ができてしまいます。これは何かインストール中の設定で間違いがあるのでしょうか。(mpiexec -n 10 hostnameとした場合なぜかちゃんと10個の応答が同じPC名でかえってきます) 理解がいまいちなので、質問の文章が分かりにくいところもありますが、教えていただけないでしょうか。 よろしくお願いします。

みんなの回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

openMPIしか使ったことが無いのですが、 >n=1より2、3、4の場合のほうが速くはなるのですが、2の場合が4より速くなってしまいます。 速さの順では n=1<4<2 ということでしょうか? n=1の場合を速度1として、残りの相対速度はどの程度になりますか? MPIの場合は分散メモリ型ですので、計算に必要なメモリ内容を転送して(同一CPUの場合はコピー)しますので、その分オーバヘッドとなり遅くなる可能性があります。 速度を上げたいのなら、同一PC内はopenMPで共有メモリ型にして、違うPCを跨ぐ場合にはMPI(分散メモリ型)という風に使い分けされてはいかがでしょうか。 n=5以上の場合の理由は分かりません。

関連するQ&A

  • 並列処理についてですが、

    並列処理についてですが、 SCOREという並列環境を構築するソフトで、4つのPC(CPU:Quad Core)を、並列化させ、 ある逐次プログラム(C言語、ラプラス方程式を差分法で解くプログラムですがプログラム内容はあまり関係ないので、あるプログラムとさせていただきます)を並列処理させたところ、 1つのPCで、4つのプロセッサを使用し、合計4ノードで並列処理を行った場合と、・・・(1) 4つのPCで各PC1台につき1つのプロセッサずつ、合計4ノードで並列処理を行った場合では、・・・(2) 同じ4ノードであるにかかわらず、 (2)がノード数に比例的に演算性能が良くなることに対して、 (1)の場合、ノード数が増えても関数log(x)(雰囲気です)をグラフにしたような形で、演算性能がうまく良くなりません このような質問を以前したところ、 ・スレッド切り替えのオーバーヘッドが影響しているのではないか ・実行環境が違うことと、ひとつのプロセスですべてのコアを占有する thread はコアを2個使えば2倍、3個使えば3倍それぞれ速くはならない。一方、PCを組み合わせて使う場合、それは完全に独立しており、データ並列のために分割されて計算量が縮小された分、PC組み合わせ数にほぼ比例して速くなる。 という回答をいただくことができました。 なんとなくで意味は分かるのですが、何卒PC初心者なもので、あまり理解することができません。 ここからが質問です。 ・「スレッド切り替え」とは一体どういったものなんでしょうか ・いただいた回答で、「ひとつのプロセスですべてのコアを占有するスレッド」とはどういうことでしょうか このことについて教えていただきたいです。スレッドとは、など部分部分での単語は調べてみましたが、 どういったように動いているのかが分かっていないせいか、上記質問のようなことが分かりません。 回答をせっかくいただいたのに自分の語彙力のせいで度重なる質問をさせていただくことを申し訳なく思いますが、みなさん回答の方よろしくおねがいします。

  • quad coreでのMPI使用法

    私はcore 2 quadを使用しています。 先日、並列計算を使用する機会があり、MPIを使用しようと思ったのですが、単体のPCに用いる場合の説明を見つけることが出来ませんでした。クラスターのような環境に使うための説明をされているHPしか見つけることが出来ず、困っています。 状況としては、 ・mpich-1.2.7p1をインストール済み。 ・CPUはcore 2 quad Q6600 ・PCは一台のみ。 ・やりたいことは、単体PCの4つのプロセッサを使用する並列計算の実行。 という感じです。 説明が分かりづらいかも知れませんが、もし参考になりそうな文書やHPをご存知でしたら、教えてください。 よろしくお願いします。

  • 並列処理プログラム

    並列処理について。 画像imageの値が0より大きい場合に、managerを実行しますが、managerの計算時間が長いです。 そこで、4つのコアでpthreadにより、並列処理をさせたいんですが、 どのようにプログラムを書けばいいかすみませんが教えてください。 あるボクセルを計算中に、次のボクセルを計算するようなプログラム。。。 for (int z=0; z<32; z++){  for (int y=0; y<32; y++){   for (int x=0; x<32; x++){    if(image(x,y,z) > 0){     total += manager(x,y,z);    }   }  } }

  • 並列処理について

    今現在Perlの並列処理について勉強しているのですが、分からない点があるのでご教授願います。 重並列が可能となるプログラムを作りたいと思い、以下のプログラムを作成しました。countには並列数(例えば3並列にしたいならば3)が入っています。これで重並列ができたと思ったのですが、よくよく考えてみると、このプログラムだと一つ目の子プロセスが終わらなければ、二つ目、三つ目の子プロセスが始まらないということに気付きました。同時に複数のプロセスを実行させるにはどのようなプログラムにすればよいでしょうか。お願いします。 while($count--){ $pid = fork; if(!defined $pid){die "fork failed";} elsif(!$pid){ &process;#子プロセス exit; } } wait; ・・・・・・#親プロセス

  • 簡易並列処理の勉強について

    ずっと以前からパソコンを並列化して計算の効率を図りたいと思っていましたが、実現しませんでした。 今日的にはグラフィックプロセッサで高速計算する時代のようですが、できれば勉強のために今一度挑戦したいと思っています。オーバーヘッドが問題で全然速くならないというのでも体験できるといいと思っています。 条件としては全く同じ仕様のPentium4のマシンが4台あり、スイッチングハブにつながれている状態です。 OSはLinux(ubuntu)で、intel のfortran compiler, intelの並列環境のソフト(名前はど忘れ)だったり、CentOS+MPI(Mpich?) だったりなどいろいろとやってみてダメでした。何でダメだったのかは忘れてしまいましたが。NFSとかNISなどその他の環境設定も付帯的に絡んでいたように思います。おそらく並列環境のセットアップではなく、その他の環境のところで引っかかったように思います。 とにかくOSも再インストールしていいですから、最初から並列処理の勉強のためのマシン設定を実現したいと思います。これだけやればよいというセットがないでしょうか。貧弱な環境ですが、勉強したいだけなので、是非やり方をご教授願いたいのですが。Linuxのディストリビューションのセットでインストールしただけでとりあえず実現できるというようなものだと大変有難いです。あるいは適当な文献とか紹介サイトなどでも結構です。 以上、よろしくお願いします。

  • 並列処理(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; }

  • 並列化での処理速度について

    実験でプログラムを並列化してその時の処理速度を測定しました。 その際に並列化をしなかった場合も測定したのですが… 1スレッドでの処理速度と並列化無しでの処理速度で並列化無しの方が早く処理は終わりました。 2スレッド以降は並列化した方が早くなったのですが… これは何かきちんとした理由があるのでしょうか? 少し自分で調べてみた結果オーバーヘッド?だかが関係しているようにも思えたのですが… 詳しい方回答よろしくお願いします!!

  • mpiによる多次元配列の送受信

    私はmpiによる並列計算プログラムをfortranを使って書いてます。 配列a(i, j, k) (i=1~10, j=1~10, k=1~10)があったとします。 これを call mpi_send(a(1, 1, 1), 100, MPI_INTEGER, ...) とすると、a(1,1,1), a(1,1,2), …, a(1,1,10), a(1,2,1), a(1,2,2), …, a(1,10,10) のようにiを固定した100個のデータが送信されますよね? これをjやkを固定してデータを送りたい場合どのようにすればいいのでしょうか?

  • debian/gnu Linuxで並列計算したいのですが・・・。

    タイトルの通りdebian/gnu Linux用の並列計算ライブラリ(mpich)をftpでとってきてdpkg -i でインストールは成功しました。 でもコンパイルしてmpirun -np 1 a.out として実行しようとすると止まってしまいます。これはどのような設定が必要なのでしょうか、それとも他に原因があるのでしょうか。ちなみに私はpcクラスタを構築したいのでこれをネットワークでつないで二台のpcで並列に処理させようと考えています。

  • Perlの並列処理

    私は今Perlの並列処理について学んでいます。3並列で子プロセスが行う処理はa1、a2、a3、・・・ak(処理にかかる時間a1<a2<a3<・・・)で、親プロセスはa1、a2、a3、・・・の結果を判定するというものです。 a1、a2、a3と順に判定していきたいと考えているのですが、どのようなプログラムを書けばよいでしょうか。なお、並列処理にはforkを利用するつもりです。 一度以下のようなプログラムを考えたのですが、これだとa1→a3→・・・→ak→親プロセス→a2→a4→・・・→a(k-1)→親プロセスとなってしまいます。よろしくお願いします。 while($count--){ #$countは並列数を入力   my $pid =fork;   &child_process;   exit; } wait; 【親プロセス】 sub child_process{   while($n<k){     $n=1;     【処理a$nを行う】     $n=$n+$count;     }   exit; }

専門家に質問してみよう