• ベストアンサー

並列計算の並列性がCPUの数が増えるほど上がる?

kimamaoyajiの回答

回答No.3

1CPUでの計算速度が問題で、演算を1CPUで行うと1つのタスクでパイプライン処理による演算がコケると、再演算になりタイムロスが生じます、それを解消するためにインテルは1CPUで2スレッド演算が出来るようにHT(ハイパー・スレッディング)を行い演算速度の向上を行っているので、1CPUでのロスタイムが大きい時は、マルチCPU、マルチタスクの分散処理の方が早く演算が求められる場合があります。 理想的状況では、1CPUの能力XCPU数を超える事はありません。

knock123
質問者

お礼

>理想的状況では、1CPUの能力XCPU数を超える事はありません。 今回が例外的なのか当方では判断できません・・・ロスタイムを生じているかどうか、どうやって判断すれば良いのでしょうか?

関連するQ&A

  • 並列計算について

    あまりパソコンに詳しい方ではありません。 今、linuxが入ったパソコン(CPU:Intel(R)Core(TM)i7 CPU970@3.20GHz,コア数12, メモリ:5.8GiB)で数値計算をしています。コンパイラはgfortranです。OpenMPを使って、並列計算をしています。 例えば、スレッドを5使って一つのプログラムの計算したとします。次に別のプログラムをスレッドを5使って同時に計算したとします。 CPUモニタで確認すると、合計12スレッド中、10スレッドが使用率100%になります。 しかし、計算時間はそれぞれ倍ぐらいになってしまいます。結局、プログラムを1 つずつ計算するのと同じ時間がかかります。また、使用するスレッドは5ぐらいが最適であることがわかっています。(それ以上多くしても計算時間が多くなるだけ)。つまり、12スレッド中7スレッドは常に仕事をしていません。 原因、及び解決方法はあるでしょうか?

  • CUDAの整数演算並列化について

    CUDAを使って行列と配列のXORの並列計算をしたいのですが早くなりますか? サイズは行列が64*64、配列が64で、データは整数です。(unsigned char) 整数データの計算は遅くなると聞いたので心配ですが、24ビット以下に抑えれば 浮動小数点と同じ速度で計算できるとも聞きました。SIMD計算に対応していれば 16ビットでもかまいません。詳しい人がいたら情報ください。 よろしくお願いします。

  • 個人PCで並列計算ができるか?速くなるか?

    並列計算を個人のPCで行って計算速度が上昇するか、また容易に並列計算ができるかについて伺いたいです。特に知りたいことは (1)プロセッサによらず並列計算をすると速くなるものか?どのプロセッサが速くなりやすいとかありますか? (2)初心者でもとっつきやすい並列計算ができるソフト、ライブラリは何か?(いくつか候補をあげてそれぞれの利点を説明して下さると有り難いです) (3)計算がどれくらい速くなるか? 以下状況と質問内容を具体的に説明します。 現在私の利用可能なプロセッサがCoreDuoのノートPC1つ、Core2Duoのデスクトップが1つです。(後者は学校にあるものなので、勝手にノートとつないで両方で計算させることができるかは不明ですが。。。)(1)についてはこのプロセッサではどうかを特に教えて頂きたいです。 今現在数値的にやらなくていはいけない処理は、行列の積、逆行列、および固有値を求めることです。行列が複素数であり、疎でもないですし、かなり行列のサイズが大きい(100×100以上にはなる)ので困ってます。 将来的にはモンテカルロ法にもお世話になるので、「行列演算」「モンテカルロ」について並列計算でどれくらい速くなるか(3)で教えて下さると助かります。 何卒よろしくお願い致します。

  • 並列計算機に詳しい方!!

    現在、分散メモリ方の並列計算機でCPUの通信をやり取りするための規格やライブラリについて調べているのですがどなたか詳しい方や、いいHP、文献などありましたら教えてください。

  • 計算機の購入

    計算機の購入を考えています。 予算は90万程度で次の条件を満たすものが欲しいです。 ・並列計算ができるマシン ・CPUのコア数は最低8core以上 ・コア数を増やすことよりも1coreあたりの処理速度が速いものを重要視している ・メモリ、HDはそれぞれ16G、1Tぐらい このような条件で、お勧めの計算機を教えて頂けたらと思っています。 他にも計算機を購入する上で気をつけることなどがありましたらご教示ください。 よろしくお願いします。

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

  • 並列化プログラムの作成方法について

    物理計算の並列化についてお尋ねします。計算機環境(GPU, メモリ分散(ハブ)、メモリ共有(CPU内での並列))、コンパイラの選択とかいろいろ条件があると思います。また、作りこみの度合い(本気度)によっても違うと思います。特に並列計算は並列化の度合いによって速度が急激に伸びるなどいろいろ特性があると思います。 現時点では、 通常のパソコン(Core-i7)で、コンパイラはintel fortran, OSはWindows10というごく普通の環境です。Cygwinのgfortran, Visual studioなどもあります。 物理プログラムは、構成として以下のようです。 2次元空間の時間発展の計算です。 do n=1,nt do i=1,nx ! x方向格子へのループ do j=1,ny ! y要綱格子へのループ enddo ! x方向格子ループの端 enddo ! y方向格子ループの橋 enddo ! 時間方向ループの終端 stop end 時間発展のループの中に、空間方向のループが何回も出てくるという構成です。計算が遅くなる理由は空間方向の格子数が極端に増えるからです。 このような場合、計算の速度を向上させるための並列化の方法についてゼロベースで教えて頂きたいのですが。ゼロベースなので、何から手を付けるべきかということですが。 よろしくお願いします。

  • 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名でかえってきます) 理解がいまいちなので、質問の文章が分かりにくいところもありますが、教えていただけないでしょうか。 よろしくお願いします。

  • ギア比と回転数から速度を計算するには?

    マニュアル車で、各ギアのギア比とエンジン回転数から速度を計算したいのですが、計算方法がわかりません。 教えてください。よろしくお願いします。

  • PC(並列化)の処理能力について

    現在、linux環境下で並列計算機を用いて、電子状態計算等の並列処理を行っています。 処理速度、処理能力についてですが、 計算ホストを1台から2台に増やすと、倍の処理能力を持つようになりました。 しかし2から3、3から4台にしていくと、今度は比例的にではなく、 ある処理速度に収束するような結果となりました。 これは、何が原因と考えられるのでしょうか? もしくは計算規模が小さいために、このような結果となるのでしょうか? 例えば、計算する空間を増大すると比例的に処理能力が 向上するのでしょうか? ご面倒かと思いますが、回答お願いします。