- 締切済み
Intel+WindowsPCの並列化処理
いまどきのPCですが、Core-i5, メモリ4G, 64ビットにintel Visual Fortran11.1.048をインストールし、コマンドプロンプトにコマンドを入力しながら利用しています。 このような状況でもCPUの分割による並列計算ができると思っています。 自分のプログラム(流体計算系)を以下のようにしてコンパイル、実行してみました。 ifort /Qparallel abc.f↓ abc.exe <ret>↓ 一応、トコトコと最後まで走っていきますが、コンパイラオプション /Qparallelをつけずにコンパイルした場合と速度はほぼ変わりません(同じと言ってもいいぐらい)。自分が何か間違っているか、並列処理では効率が上がりにくいつくりになっているのかわかりませんが。ただ、このコンパイラオプションは自動並列化で、ソースの作り方が少々悪くても対応するのではないかと思っています。 (悪いのは悪いのなりに、比率の比較はできるだろうと思うのですが) また、コンパイラオプションですが、いろんなサイトを見ると、-parallel となっている場合が多いですが、ifort -helpでオプションを調べると、/Qparallel と表示されます、これでいいでしょうか。 もう1つお願いなのですが、フォートランのプログラムで並列化オプションの有無ではっきりパフォーマンスの違いがわかる簡単なサンプルコードがないでしょうか。ラプラス方程式とかポアソンソルバーとか割とソース事態は短くて、並列効果が顕著なコードですが。ネットで見るとあることはありますが、C言語だったりします。 自分で作ると、あまり効果がわからないので、これぞ、並列効果というのがわかるとありがたいです。 また、それによって、自分の環境ががんばり次第で並列化で高速化できるという自信にもなります。 (今効果が出ないのは、ひょっとしたら並列環境のインストールにミスがあるのではないか、私が何か勘違いしているのではないかと疑いもあるからです。) 並列化の処理速度以外でこのコンパイラの動作に異常はないようです。 以上、よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- ki073
- ベストアンサー率77% (491/634)
追加でもう一つプログラムをのせておきます。 基本的にはNo.2の二重ループの内外を入れ替えたものです。 今度は外側のループがデータ依存性があり、内側がなくなります。コンパイラは内側をベクトル化して(SSEを使うようにして)最適化します。CPUコアを1つしか使わなくても、実はNo.2の4coreよりも速いのです。 この辺りのことに興味がありましたら書き込んでください。もう少し説明します。 ----------- program test integer I, J integer,parameter :: N=10000, M=50000 real X(N), SUMX DO I = 1,N X(I)=I*3.14159/N ENDDO DO J = 1, M DO I = 1,N X(I)=sin(X(I)) ENDDO ENDDO SUMX=0.0 DO I = 1,N SUMX=SUMX+X(I) ENDDO PRINT *, SUMX end program
- ki073
- ベストアンサー率77% (491/634)
並列化の効果がわかるサンプルプログラムを載せておきます。並列化以外の自動最適化をやりにくいようにわざわざしていますので、実用価値は全然ありません。4coreと1coreで比較して3.5倍程度の速度差はあります。 プログラムを高速化したいときには、 profilerを使って時間のかかる部分を特定し、コンパイラの最適化情報を参考にしてオプションを追加したり、プログラムを変更したりします。 http://itcweb.cc.affrc.go.jp/affrit/faq/scs-faq/parallel の真ん中あたりに最適化情報の出し方が書かれていますので参考に。 IntelのコンパイラではなくPGIのコンパイラの下記のプログラムの最適化情報の出力結果です。 7, Parallel code generated with block distribution 9, Loop not vectorized: data dependency 15, Loop not parallelized: may not be beneficial Generated vector sse code for the loop Generated a prefetch instruction for the loop 7行目からの二重ループで、内側はデータの依存関係があるので並列化できず、外側のループでやっています。 要するにデータの依存関係のないループでないと並列化ができません。 /Qparallelと-parallelはWindowsとLinuxの違いのようです。Linuxの場合は更にOMP_NUM_THREADSの設定も必要なのですが、Windowsの場合も必要かもしれません。 ---------- program test integer I, J integer,parameter :: N=10000, M=50000 real X(N), SUMX DO I = 1,N X(I)=I*3.14159/N DO J = 1, M X(I)=sin(X(I)) ENDDO ENDDO SUMX=0.0 DO I = 1,N SUMX=SUMX+X(I) ENDDO PRINT *, SUMX end program
コンパイラの動作の仕組みやオプションは詳しくないのですが、並列処理が行われているかどうかは、タスクマネージャーのCPU利用率グラフで確認できるのではないでしょうか。 以前、デュアルコアの走りのころ、VBScriptで単純ループを実行させた時、見事なぐらい片コアしか使ってくれてなかったのを思い出しました。
お礼
ありがとうございます。 ひとまず、複数のCPUで動作していることを確認しました。タスクマネージャのモニター(時系列グラフ)がCPU分が出て、並列オプションの有無でグラフの出方の違いを確認できました。ちょっと不思議だったのは、並列オプションをつけなくても2CPUが動作するということですが、オプションを着けると全部動作します。速度は変わりませんでした。ひょっとしたら、オプションをつけなくても適当に最適化されて2CPUで自然に走ってしまうのではないかということですが。オプションをつけると速度があがらなくても無理やり分割して並列計算をしてしまうのかも。 また、タスクマネージャがタスクバー(ウィンドウ下部バー)を右クリックして起動することも忘備録として書いておきます。