• 締切済み

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言語だったりします。 自分で作ると、あまり効果がわからないので、これぞ、並列効果というのがわかるとありがたいです。 また、それによって、自分の環境ががんばり次第で並列化で高速化できるという自信にもなります。 (今効果が出ないのは、ひょっとしたら並列環境のインストールにミスがあるのではないか、私が何か勘違いしているのではないかと疑いもあるからです。) 並列化の処理速度以外でこのコンパイラの動作に異常はないようです。 以上、よろしくお願いします。

みんなの回答

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

追加でもう一つプログラムをのせておきます。 基本的には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)
回答No.2

並列化の効果がわかるサンプルプログラムを載せておきます。並列化以外の自動最適化をやりにくいようにわざわざしていますので、実用価値は全然ありません。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

noname#189141
noname#189141
回答No.1

コンパイラの動作の仕組みやオプションは詳しくないのですが、並列処理が行われているかどうかは、タスクマネージャーのCPU利用率グラフで確認できるのではないでしょうか。 以前、デュアルコアの走りのころ、VBScriptで単純ループを実行させた時、見事なぐらい片コアしか使ってくれてなかったのを思い出しました。

skmsk19410
質問者

お礼

ありがとうございます。 ひとまず、複数のCPUで動作していることを確認しました。タスクマネージャのモニター(時系列グラフ)がCPU分が出て、並列オプションの有無でグラフの出方の違いを確認できました。ちょっと不思議だったのは、並列オプションをつけなくても2CPUが動作するということですが、オプションを着けると全部動作します。速度は変わりませんでした。ひょっとしたら、オプションをつけなくても適当に最適化されて2CPUで自然に走ってしまうのではないかということですが。オプションをつけると速度があがらなくても無理やり分割して並列計算をしてしまうのかも。 また、タスクマネージャがタスクバー(ウィンドウ下部バー)を右クリックして起動することも忘備録として書いておきます。

関連するQ&A

  • 並列化プログラムのコンパイル環境と実行環境が違う

    fortran77で物理計算をしています。 パソコンが2つあって、一つは個人で使うもので、もうひとつはスパコンです。 個人PCのコンパイラはifort、スパコンはfrtが入っています。 普段は個人PCのifortでコンパイルしてからスパコンに実行ファイルを転送して走らせています。 今のところこれで問題ありません。 このプログラムを並列化して計算時間を短縮しようかなとおもっています。 mpiなりopenMPなりでプログラミングして、(もしくはifortの自動並列化コマンドを使う) (1)ifortでコンパイルしたものをスパコンに送って走らせる方法 と、 (2)スパコン内のfrtでコンパイルして走らせる方法 では 実行速度は劇的に変わるものでしょうか? frtの使い方がイマイチわからずmakeが通らないので出来れば避けたいなと思って質問させていただきました。 勉強不足な点があると思いますが、よろしくお願いします。

  • インテルのフォートランの更新について

    インテルフォートランのver.11をWindows環境で使っています。そろそろ10年ぐらいになるのですが、これまで製品の更新が何回かあった思いますが、これを使い続けました。製品の更新の内容はGPUとか並列処理のようだったので、そのような計算機に特化して高速化することはあるのだろうと思いました。一方でそのようなハードに対応しなくても計算機そのものが高速化しているのでそれに連れてこのような少し古いコンパイラでも計算の速度は向上していると思っているのですが、どうでしょうか。逆にハードの更新に伴って古いコンパイラは使いづらくなっていく(コンパイラの更新はフォローすべき)ということなのでしょうか。予算の都合もありますが。よろしくお願いします。 ※インテル製品はCのコンパイラも平行してあるので、こちらに質問しました。

  • Fortranの割り算について

    フォートランによる数値計算についてお尋ねします。(技術系では今でもフォートランが現役なので) 何百万回も割り算をするアルゴリズムがあります。分母は定数で、分子がいっぱい変化します。としますと、割り算ではなく、分の1を計算して掛け算にしてもよいわけです。精度よりも高速化のほうが今はウェイトが高い状況です。 プログラムとしてそのように組んだ方が速いかも、と思いますが、一方でコンパイラが気を利かせて掛け算としてコンパイルしているかも知れません。もし、そうならばプログラムを書き換える意味がありません。 このあたりがコンパイラオプションなのかな?と思いますが、デフォルトでどのように計算しているか不明なのです。 以前の数値計算の本(PC-9801の頃)では時間を計って”ほら、割り算より掛け算が早いでしょ”ということを示すものなどがありました。そのような場合はコンパイラがそこまで気を利かせていないということになりますが、だいたいのところコンパイラは割り算をできるだけ掛け算に変更しようとしているのでしょうか。 PC上でのフォートラン(コンパックフォートランです。Microsoft,DECとオーナが変わってきてついに終わってしまったPC用のあのフォートランです。)を使っています。藁をも掴む思いで高速化を進めています。いかがでしょうか。

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

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

  • GNUコンパイラとIntelコンパイラの違いについて

    今回fortranとC言語で書かれたWindows用プログラムをLinux用に移植することになりました。GNUのコンパイラを使用し無事コンパイルできたので実行したのですが"Segmentation fault"となりうまく実行できませんでした。そこで試しにIntelのコンパイラを使用しコンパイルしてみたところGNUのときとは違い"Segmentation fault"とは出ず、プログラム内のエラーチェックに引っかかり止ってしまいました。同じソースコードにもかかわらず止まる箇所が異なります。 今まで考えたことがなかったのですがGNUとIntelのコンパイラの違いはなんなのでしょうか?また、この二つ以外にいいコンパイラはあるのでしょうか?

  • Fortranのバージョンアップと古いソースコード

    Fortranは科学技術計算の古い資産が使えるということでまだ使われていると思います。 しかも、コンパイラ・リンカは製品としてバージョンアップしているわけですが、新しくなっても古いコードはコンパイル・リンク・実行できると思っていました。最近、intel fortranの更新をしたのですが、動作がかなり違ってきました。F77,F90,F95などの更新ではなく、intel社の製品としての最新版への更新です。コンパイル・リンクまでは行くのですが、実行させたとたん、ゼロ割のようなメッセージが出て、実行が打ち切られてしまいます。1時間ぐらい走るプログラムなのですが、1秒で打ち切りでした。必ずそうなるということではありません。特定のライブラリで生じます。そのライブラリは古い(言語としてはF77)ので当然ながら新しいコンパイラで動くなどと書いていません。ただソースコードの塊であり、古いコンパイラでは動いていたのです。古いと行っても2009年ぐらいに買ったintel visual fortran ver.11ぐらいのもので2016年のコンパイラと大幅な変更はないはずなのですが。例えば最新版(2016年2月時点)の方は並列関係の設定の方がデフォルトで並列計算しない設定をコンパイラオプションで指定しないとおかしくなるということでしょうか(たぶんGPUには対応していないと思いますが)。どっかに書いてあるかなと思案していますが。 何か心当たりがあればよろしくお願いします。

  • Borland C++ Conpilerと「ーW」

    私は趣味でプログラミングしようと思っている初心者です。 Borland C++ Conpilerを使っていますが Windows アプリケーションを作ろうとコマンドラインでソースコードをコンパイルするとき「ーW」というオプションをつけるようですがなぜこのコンパイラはわざわざ「ーW」をつけるようになっているのでしょうか?コンパイラをWindows アプリケーションを作るときに「ーW」のようなオプションをつけるようにする、しない、でどのようなメリット、デメリットが生まれるのでしょうか?

  • Javaで並列計算

    並列計算クラスタの購入を勧められられています。 ところで、Javaで並列計算をやる方法ってあるのでしょうか?簡単でしょうか? 今のところ、シリアルの計算を複数流す、くらいしか使う方法が思いつかないのですが、並列計算がJavaで簡単に出来るのなら、ソースコードを作り直そうと思っています。 経験者の方か、知識がある方ががいらっしゃったらうれしいです。

  • コンパイルできない?

    数値計算用のソフトとして、コンパイラにSalfordのFORTRAN77、エディタにCpadを使用しています。 ソースコードをCpadに書き込み、コンパイルしてコマンドプロンプトを開き、必要な数値を入力して計算をしています。 ですが、どこも間違っていないソースコードを使用しているにも関わらず、「コンパイルに失敗しました」と表示され、計算ができないということが発生し困っています。 たとえば、どこも間違っていないソースコード「A」をコピーし、コピーしたソースコードをCpadに貼り付けてソースコード「B」を作成したとします。 普通であれば、「A」で計算可能であれば「B」でも可能なはずです。 ところが「B」をコンパイルしようとすると、「A」をコピー時にどこも変えていないにもかかわらず「コンパイルに失敗しました」と表示されてしまうのです。 Cpadを再インストールしてみましたが、この問題は解決しませんでした。 原因として考えられるものは何なのでしょうか? 数値計算に関してはど素人同然ですので、お手柔らかにお願い致します。

  • intel fortran cimpilerでプログラムファイルがコンパイルできない

    こんにちは。 当方プログラムに関しては全くの初心者です。 研究で早急に計算プログラムを使用したく、 現在intel fortran cimpiler8.0を使い、とあるソースファイルをコンパイルしたいのですがうまくいきません。 コンパイルの手順としてあっているのか自信がないのですが、 とりあえずやってみて、以下のようにエラーが出ます。 $ source /opt/intel_fc_80/bin/ifortvars.csh bash: /opt/intel_fc_80/bin/ifortvars.csh: line 28: syntax error: unexpected end of file $ ifort /home/ディレクトリのパス/ファイル名.f90 ifort: error: could not find directory in which g++ resides これはどういうことなのでしょうか?? どなたかご教授お願いいたします。 ちなみに、使用しているOSはlinuxのFedora.core1です。

専門家に質問してみよう