• ベストアンサー

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

並列計算をMPIを用いて行っているのですが、 CPUを2個使ったの時に掛かった計算時間を1として、 4、8、16  と使用CPU数を増やしていくと、計算速度が 1.5、10、20 と、CPU数以上に伸びていきます。 普通、CPU数以上に早くなる事は無いと思っていたのですが、1つ当たりのCPUで使用するメモリ、配列サイズが少なくなったせいで計算速度が上がることがあった、あり得る事なのかな?と思ったのですが・・・実際にCPU数よりも計算速度の速度比が上がる事はあり得るのでしょうか? 計算結果をみると、正しいです。

質問者が選んだベストアンサー

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

>1つ当たりのCPUで使用するメモリ、配列サイズが少なくなったせいで計算速度が上がることがあった、 CPUに内蔵されているキャッシュメモリに収まる程度にアクセスする配列のサイズが小さくなったときにはあり得ます。プログラムの高速化のテクニックの1つです。大きな配列を端から端まで何度も読み書きしているプログラムの場合に効果があります。 MPIでCPUに振り分けているのを、1つのCPUで順次実行するようにプログラムを書き換えると速度が上がるはずですので確認できます。 並列化ができているようですので、もしGPUとopenACCが利用できるのであればかなり速くなるように思います。

knock123
質問者

お礼

回答有難うございます。 確かに16CPUだと、一つに割り振られる配列数がかなり少なくなりますので、キャッシュメモリに収まるかもしれません。 今回、GPUとCPU並列の速度比較テスト中です。 差分計算ではあるのですが、計算時間が最も掛かるFORループからIF文を取り除けないので、どこまで早くなるのか・・・GPUは思ったよりも万能ではない、と感じています。

その他の回答 (5)

回答No.6

パイプラインの予想演算で、規則的なパターン例えばコーデックの様な物は失敗は少ないです。 一方不規則な演算では予測してパイプラインで並列演算をしても、予測が外れる場合が多くなります。 具体的にどうと言うのは私レベルでは説明が難しいですが、CPUベンチマークPASSMARK http://www.cpubenchmark.net/cpu_list.php Core i5 4670K@3.4GHz 7801 Core i7 4770@ 3.4GHz 9954 Pentium G3430 @ 3.30GHz 3378          HT無しTBなし Core i3-4130 @ 3.40GHz 4858X(3.3/3.4)=4715 HT有りTBなし においてHTを搭載していない、PentiumとCore i3もしくはCore i5とCore i7の同じCPU数で比較してみてHT搭載の方が、クロック当たりの性能が上になります、HTは3GHzのCPUが理論上1.5X2の筈なんですが、それ以上の効果が出る事から、スレッド数が多いほど最大限の効率を出していると言えます、つまり処理するスレッド(CPU数)が多いほど演算効率が良いと言えるのではないでしょうか、でなければインテルがHT機能を付けた事が無意味と言う事になります。 どの演算でという事はPassmarkのベンチを実際にPentiumとCore i3で行って比較するしかありません、このペンチは有料で、実は私の場合試用期間が過ぎているので試せませんので、どの演算の部分という事は検証できなく、お伝えできません。

knock123
質問者

お礼

回答有難うございます。 HT機能が計算を早くしているのですね・・・。使用しているのはXeonなのでその効果もあるのでしょうね。

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

No.4です。 >GPUは思ったよりも万能ではない、と感じています。 確かにそう思います。私自身はopenACCを使っていますので、CPU用に書いたプログラムをほとんど修正なしにGPU用プログラムにできるので、GPUとの比較をよくしますが、GPUの方が遅い場合がほとんどです。 書かれているようにループの中にif分があるとかなり苦しいです。見かけ上の計算量が十倍程度増えてもif分が取り除けるようであれば、そのコードの方がかなり速かったりします。ご参考に。

回答No.3

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

knock123
質問者

お礼

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

  • parts
  • ベストアンサー率62% (6364/10149)
回答No.2

長時間にわたる高度なデータ演算で且つマルチスレッド最適化がされているものあれば普通のことです。後は、いくつのプロセッサに最適化しているかだけの問題ですよ。 答えとしては、処理内容によります。というのが正しいのかな? これは、スレッド粒度とタスクの関係によるものです。1+1の計算を2つのプロセッサで分離して2倍になるかということと同じです。また、1+2の結果に100を掛けなさいで、性能は2倍になるでしょうか、下手に投機的な処理が働き2つのコアで1+2と出ていない結果A×100をされたら、処理を差し戻され、その分のクロックを失います。 その逆です。要は、処理が膨大な時にプロセッサに割り振る処理の内容をどれだけの粒度で与えるかによって、プロセッサ数倍以上の性能を発揮することがあるのです。 例えば、質問者様がリンゴ16個が入った箱のリンゴを一人で、検品し8つの箱に分けなさないと言われたとしましょう。大きさで特大、大、中、小の4種類と傷あるなしも、大きさで判断し、8つに分けるのです。 さあ、頑張って、箱は100箱あります。 何時間で終わるでしょうか? その作業をする人が二人になると、どれだけ早くなるでしょうか? 4人になると・・・。 8人なら、16人なら・・・。 これを如何に早く終わらせるかは、それを指揮する人がどのような区分け方法を考えるかによります。プログラミングであれば、例えば最初に届いたリンゴの箱の中身を、1~16番まで決めて、1からひとつずつ大きさを確認し、その後、傷を見て、そして箱に分けるのが、普通です。 しかしまず、傷があるかないかだけで箱を一つ使って選別し、もう一度箱に戻し、大きさを次に分ける方法でも良い。 そもそも、100箱を調べるなら数箱を手分けして、いっぺんにやる方法もあるでしょう。それに選別の仕方でいくつかのステージ分けをすることもできます。 これが答えです。 例えば、例えば仕分け班が本来4人一組だと効率的な作業を、二人でやっていたなら、Aの作業が終わった、次にBの作業が必要になります。その都度準備が必要です。物差しと専用のめがね(ルーペ)がそれぞれ必要だと仮定した場合、その持ち替えだけで時間が掛かります。 しかし、4人になると、Bの作業は別の二人が行います。そうなると、物差し係とめがね係がそれらを交換しなくとも作業できるようになり、時間短縮になります。8人になると、4人1組の組が増えるだけですから単純に作業時間はその倍数になります。 この場合は、たぶん4人で一連のグループが終わる設計であると思われますが、1つの作業が終わったタイミングで、内容の入れ替えを行う例えば、着替えが必要だとしましょう。だとしたら、その時間は処理には含まれませんが、着替えるために時間が掛かります。Waitとなるのです。 しかし、専業の人がいれば、そこに渡せば次の処理が行われます。 だから、待ちはゼロとなり、その待っていた分の時間が無くなるため、速度は倍速以上になります。 ただし、今回は100箱の箱だったとして、100組以上(例えば200組)のスタッフが作業をしても、速度は上がりません。1+1を2つのプロセッサで行っても速度が向上しないのと同じ原理です。 これは、一般に長時間同じ処理(ループ)演算を分散して行えるように設計されたプログラムではよく起きることで、個人であれば動画エンコードや編集などが該当するぐらいしかありませんので、あまり知られていません。スレッドの粒度は、Hyper Threadingが登場した頃には、よく言われていましたけど、今では知らない人も多いですし、かなり自動化もすすでいますから、開発者でさえも理屈は知らない場合が多いのです。 いかがでしょうか?

knock123
質問者

お礼

丁寧な回答ありがとうございました。 すみません、あまり私の知識不足で仰る意味がよく分からなかったのですが、 早くなることもあるとのこと、良かったです。

  • aokii
  • ベストアンサー率23% (5210/22062)
回答No.1

CPU数よりも計算速度の速度比が上がる事はあり得ません。

knock123
質問者

お礼

ありがとうございます。

関連する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台にしていくと、今度は比例的にではなく、 ある処理速度に収束するような結果となりました。 これは、何が原因と考えられるのでしょうか? もしくは計算規模が小さいために、このような結果となるのでしょうか? 例えば、計算する空間を増大すると比例的に処理能力が 向上するのでしょうか? ご面倒かと思いますが、回答お願いします。