いま、複数(といっても16個ですが)の重い計算をさせようとしていて、できるだけ早く終わらせるにはどうしたらいいんだろうと思いました。
同時に走らせると速くなる要因
同時に走らせると遅くなる要因
これらの要因の組み合わせで決まるので、結果は条件(主にプログラムの書き方)によって異なります。
一般には、1個ずつでも16個同時でもなく、数個同時に走らせた場合が一番速くなるケースがわりと多いです。
全プログラムを一度のできるかは、CPU使用率が問題になりますが、基本的には逐次実行より並列実行の方がトータル時間は短くなります。
並列実行の方が早いのですね。
もしよろしかったら、その理屈を教えていただけないでしょうか?
まあ、逐次実行の方が早い場合は、どういう場合でしょうか??
昔に似たような実験をしたことがあります。
当時はWin2000でしたが、、、
その際には、同時に処理させた方が早かったです。
今のマシンと環境が違うので一概に言えませんが、
10種類のプログラムでは、そのような結果でした。
ITmedia エンタープライズ:マルチタスク――プロセススケジューリング(その1)
タスク切り替えは、比較的重い操作になりますので、逐次実行の方が速いと思います。
URLはLinuxの説明ですが、Windowsでもタスク切り替え時にレジスタ退避などが同様に行われます。
並列処理にしてしまうと、タスクの切り替え処理という、余計な処理がでてしまうのですね。
納得です。
結論から言うと、非常に特殊な場合を除き、
並列実行の方が逐次実行より早くなります。
非常に単純化した例で説明すると、
時間を浪費するのが、大きく、
a.CPUで計算する。
b.ディスクにアクセスする。
の2つあると考えた時、
プログラムY:
CPUでの計算 1秒
ディスクへのアクセス 1秒
プログラムZ:
CPUでの計算 1秒
ディスクへのアクセス 1秒
の2つのプログラムを並列で走らせると、
プログラムYがCPUを使っている時、
プログラムZがディスクアクセスを行うといった感じで、
トータルは、4秒より少なくなります。
(CPU計算とディスクアクセスが同時に行える)
一方で、逐次的に走らせると、
必ず4秒かかります。
ただし、YとZ双方ともに、
CPUのみ浪費するようなプログラムの場合は、
並列実行の効果が少なく、
トータルは同じような時間となります。
このような単純化した回答でどうでしょうか?
あ、ディスクアクセスも関係してきますね。ますます納得です。ありがとうございました。
CPUがシングルコアの場合は、並列処理はやらないほうがいいでしょう。マルチコアの場合は並列で処理してもいいと思います。
並列処理をする場合、プロセスの切り替えのときにレジスタの退避などをしなければなく、負担がかかります。
シングルコアの場合はやらないほうがいいでしょう。
マルチコアの場合でもCPUによっては、レジスタ回避は起こりうるのではないでしょうか?マルチコアなら、コア毎にレジスタがあるものなのでしょうか?レジスタはCPUの一部な気もするので、それでOKなような気もします。
同時に走らせると速くなる要因
同時に走らせると遅くなる要因
これらの要因の組み合わせで決まるので、結果は条件(主にプログラムの書き方)によって異なります。
一般には、1個ずつでも16個同時でもなく、数個同時に走らせた場合が一番速くなるケースがわりと多いです。
丁寧にありがとうございます。
I/Oと演算の並列処理は、OSがやってくれるのですか?(うまく並列できるタイミング実行してくれるものなのでしょうか?)
並列にプログラムを動作させた場合、より高速に
処理が完了するかかの目安として
1. 入出力(ファイル読み書き、DISK性能)の回数、データ量
2. 外部プログラム呼び出し(画面表示等,OS呼び出し、
通信、外部アプリ呼び出し)
3. メモリー不足 (今回は問題ない )
4. ハードパワー不足(CPU性能,メモリーバンド幅,I/Oバンド幅)
5. 複数のプログラム動作(常駐プログラムが多数動作している)
6. OSのリソース割り当て方法
1,2の処理をプログラムが行っている間、プログラム
は停止する事になります。 この時間の長さが長い
場合、並列処理により処理が早く完了する可能性があります。
逆に、数値計算のような計算処理をメモリー上で行う場合は
並列処理の効果がほとんどありません。
Windows OSの場合、画面(GUI)の設定が
プログラム動作に大きく影響する場合があります。
(システムのプロパティ→ 詳細設定→ パフォーマンス)
6 Windowsではフォーカスウインドが
CPU空き時間のおおよそ 75% その他が 25%
位に割り当てがされてしまします。
http://support.microsoft.com/default.aspx?scid=kb;ja;259025
========================================
プログラムを早く終わらせるにはどうすれば
よいか?
早くする対策:
(1) 1,2の時間を短くするプログラムに改造する。
(2) 6の影響を受けないようにプログラムをREALTIME
またはHIGH PRIORITYモードで起動する。
CPUの使用率を見ながら同時起動するプログラム
数を増やしてCPUの利用率が100%以下である間増やしてゆく。
例:xxx.bat
start /REALTIME xxx.exe
or
start /HIGH xxx.exe
(タスクマネージャのプロセスタブの該当
プロセスの優先順決定で確認できる)
(3) より高速処理を求める場合
Hyper Threading,Dual Core,Multi CPU
等の計算に使えるCPUの数を増やす対策,
または、より高性能なCPU
(4) あまったパソコンが数台あるなら
グリッドコンピューティング(分散処理)
http://open-bio.jp/archive/20041213_BOF/Xgrid-Ogishima.pdf
※:プログラムの実行環境の仮定
(1)プロセスでスレッド、ファイバーは使わないと
(2)OSは、Windows XP Home/Pro
※:
簡易確認は、タスクマネージャを表示してプロセスタブ
を表示して、メニューの表示で列の選択を行い。
表示内容にCPU使用率,I/O xxx,最大メモリー使用量,
ページング回数を選択する事により確認できる。
(詳細データを取りたい場合は、管理ツールの
パフォーマンスモニターを使う)
丁寧にありがとうございます。
元の質問からは脱線してしまうのですが、
grid は早いのでしょうか??
あまってる計算機を利用するという点ではすばらしいのですけど、通信が大きなボトルネックになるような気がします。
みなさま、ありがとうございました。
並列処理の場合、プロセスの切り替えとI/Oが
ボトルネックになりそうということがわかりました。どうもありがとうございました。
丁寧にありがとうございます。
I/Oと演算の並列処理は、OSがやってくれるのですか?(うまく並列できるタイミング実行してくれるものなのでしょうか?)