いまどきの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言語だったりします。
自分で作ると、あまり効果がわからないので、これぞ、並列効果というのがわかるとありがたいです。
また、それによって、自分の環境ががんばり次第で並列化で高速化できるという自信にもなります。
(今効果が出ないのは、ひょっとしたら並列環境のインストールにミスがあるのではないか、私が何か勘違いしているのではないかと疑いもあるからです。)
並列化の処理速度以外でこのコンパイラの動作に異常はないようです。
以上、よろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
コンパイラの動作の仕組みやオプションは詳しくないのですが、並列処理が行われているかどうかは、タスクマネージャーのCPU利用率グラフで確認できるのではないでしょうか。
以前、デュアルコアの走りのころ、VBScriptで単純ループを実行させた時、見事なぐらい片コアしか使ってくれてなかったのを思い出しました。
ありがとうございます。
ひとまず、複数のCPUで動作していることを確認しました。タスクマネージャのモニター(時系列グラフ)がCPU分が出て、並列オプションの有無でグラフの出方の違いを確認できました。ちょっと不思議だったのは、並列オプションをつけなくても2CPUが動作するということですが、オプションを着けると全部動作します。速度は変わりませんでした。ひょっとしたら、オプションをつけなくても適当に最適化されて2CPUで自然に走ってしまうのではないかということですが。オプションをつけると速度があがらなくても無理やり分割して並列計算をしてしまうのかも。
また、タスクマネージャがタスクバー(ウィンドウ下部バー)を右クリックして起動することも忘備録として書いておきます。
No.2
- 回答日時:
並列化の効果がわかるサンプルプログラムを載せておきます。
並列化以外の自動最適化をやりにくいようにわざわざしていますので、実用価値は全然ありません。4coreと1coreで比較して3.5倍程度の速度差はあります。プログラムを高速化したいときには、 profilerを使って時間のかかる部分を特定し、コンパイラの最適化情報を参考にしてオプションを追加したり、プログラムを変更したりします。
http://itcweb.cc.affrc.go.jp/affrit/faq/scs-faq/ …
の真ん中あたりに最適化情報の出し方が書かれていますので参考に。
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
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 工学 コンデンサメインの降圧回路 6 2022/09/02 17:20
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- 数学 すべての自然数とすべての実数を1対1で対応させる(すべての実数を一列に並べる)方法について 3 2023/05/26 17:14
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Excel(エクセル) 列の複数ある空白セルを飛ばして、セルに並べて表示したい 3 2023/02/12 16:49
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルブックの全シートの非表示列を再表示したい 1 2022/12/24 20:48
- その他(コンピューター・テクノロジー) レポート 現代の情報科学における課題点を以下の中から少なくとも2つ選び、論ぜよ。 1 2023/01/22 10:12
- Excel(エクセル) 範囲指定をした中で、住所の列をユーザー設定の並べ替えをしたい 3 2022/05/15 13:51
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- YouTube youtubeのTOPページの動画紹介画面の並び方を変えたいです。 1 2023/03/18 09:25
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
volatile修飾について
-
C++ で、「)」が必要 というエ...
-
Linux/Unix系C言語...
-
【エラー】Cpadで初めてコンパイル
-
0除算して、落ちるプログラムと...
-
IntelのMKLをC++で使用したいの...
-
無償ボーランドC++5.5の...
-
PICマイコンでGIEビットが1に出...
-
関数の返す値で直接Bitをセット...
-
COBOLのEVALUATE文について
-
インクリメント演算子のみを用...
-
Vba 実数および実数タイプの変...
-
Notepad++の関数リスト表示でC...
-
Stuck
-
自動クエリとはどういうもので...
-
プログラミング
-
ruby
-
正しい五十音順について
-
PICマイコンのコピー(クローン...
-
これはDos攻撃になりますか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
変数(関数)名の頭に_
-
Visual C++とVisual C++.NETの違い
-
Eclipseの環境設定について
-
volatile修飾について
-
コンパイラについて
-
linuxのセキュリティ対策と致し...
-
__extension__
-
io.hをincludeするとそのような...
-
コンパイラフラグ(compiler fla...
-
PICマイコンによる乱数の表示に...
-
conio.h? curses.h?
-
【エラー】Cpadで初めてコンパイル
-
ABAQUS ユーザーサブルーチン...
-
関数の戻り値による変数の初期化
-
Delphiの逆コンパイル
-
プリコンパイラとは?
おすすめ情報