パソコンで、複数のプログラムを走らせたいとき、逐次的にプログラムを実行せた方場合と、一度にすべてのプログラムを実行させた場合で、全プログラムの終了時間に違いはあるのでしょうか。ただし、全プログラムを一度に走らせたとしても、メモリーを100%使うことはありません(メモリーは十分にあります)



いま、複数(といっても16個ですが)の重い計算をさせようとしていて、できるだけ早く終わらせるにはどうしたらいいんだろうと思いました。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/06/01 00:25:29
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:teikan No.6

回答回数61ベストアンサー獲得回数5

ポイント28pt

同時に走らせると速くなる要因

  • I/Oと演算の並列処理、I/O同士の並列処理
  • 演算の並列処理(マルチプロセッサ・マルチコア・ハイパースレッディングの場合)

同時に走らせると遅くなる要因

  • タスク切替(ページテーブル切替・コンテキスト切替)
  • メモリキャッシュヒット率低下
  • ディスクキャッシュヒット率低下

これらの要因の組み合わせで決まるので、結果は条件(主にプログラムの書き方)によって異なります。

一般には、1個ずつでも16個同時でもなく、数個同時に走らせた場合が一番速くなるケースがわりと多いです。

id:birdythemighty

丁寧にありがとうございます。

I/Oと演算の並列処理は、OSがやってくれるのですか?(うまく並列できるタイミング実行してくれるものなのでしょうか?)

2006/06/01 00:07:37

その他の回答6件)

id:maamaamaa No.1

回答回数266ベストアンサー獲得回数6

ポイント18pt

全プログラムを一度のできるかは、CPU使用率が問題になりますが、基本的には逐次実行より並列実行の方がトータル時間は短くなります。

id:birdythemighty

並列実行の方が早いのですね。

もしよろしかったら、その理屈を教えていただけないでしょうか?

まあ、逐次実行の方が早い場合は、どういう場合でしょうか??

2006/05/31 21:30:27
id:J_is_James No.2

回答回数185ベストアンサー獲得回数1

ポイント6pt

昔に似たような実験をしたことがあります。

当時はWin2000でしたが、、、

その際には、同時に処理させた方が早かったです。

今のマシンと環境が違うので一概に言えませんが、

10種類のプログラムでは、そのような結果でした。

ダミーhttp://www.msn.co.jp/home.armx

id:makeworld No.3

回答回数75ベストアンサー獲得回数23

ポイント17pt

ITmedia エンタープライズ:マルチタスク――プロセススケジューリング(その1)

タスク切り替えは、比較的重い操作になりますので、逐次実行の方が速いと思います。

URLはLinuxの説明ですが、Windowsでもタスク切り替え時にレジスタ退避などが同様に行われます。

id:birdythemighty

並列処理にしてしまうと、タスクの切り替え処理という、余計な処理がでてしまうのですね。

納得です。

2006/05/31 21:46:12
id:sepiamoon No.4

回答回数8ベストアンサー獲得回数0

ポイント17pt

結論から言うと、非常に特殊な場合を除き、

並列実行の方が逐次実行より早くなります。

非常に単純化した例で説明すると、

時間を浪費するのが、大きく、

a.CPUで計算する。

b.ディスクにアクセスする。

の2つあると考えた時、

プログラムY:

  CPUでの計算    1秒

  ディスクへのアクセス 1秒

プログラムZ:

  CPUでの計算    1秒

  ディスクへのアクセス 1秒

の2つのプログラムを並列で走らせると、

プログラムYがCPUを使っている時、

プログラムZがディスクアクセスを行うといった感じで、

トータルは、4秒より少なくなります。

(CPU計算とディスクアクセスが同時に行える)

一方で、逐次的に走らせると、

必ず4秒かかります。

ただし、YとZ双方ともに、

CPUのみ浪費するようなプログラムの場合は、

並列実行の効果が少なく、

トータルは同じような時間となります。

このような単純化した回答でどうでしょうか?

id:birdythemighty

あ、ディスクアクセスも関係してきますね。ますます納得です。ありがとうございました。

2006/05/31 21:48:08
id:zufall No.5

回答回数18ベストアンサー獲得回数1

ポイント17pt

CPUがシングルコアの場合は、並列処理はやらないほうがいいでしょう。マルチコアの場合は並列で処理してもいいと思います。

並列処理をする場合、プロセスの切り替えのときにレジスタの退避などをしなければなく、負担がかかります。

シングルコアの場合はやらないほうがいいでしょう。

id:birdythemighty

マルチコアの場合でもCPUによっては、レジスタ回避は起こりうるのではないでしょうか?マルチコアなら、コア毎にレジスタがあるものなのでしょうか?レジスタはCPUの一部な気もするので、それでOKなような気もします。

2006/05/31 23:56:37
id:teikan No.6

回答回数61ベストアンサー獲得回数5ここでベストアンサー

ポイント28pt

同時に走らせると速くなる要因

  • I/Oと演算の並列処理、I/O同士の並列処理
  • 演算の並列処理(マルチプロセッサ・マルチコア・ハイパースレッディングの場合)

同時に走らせると遅くなる要因

  • タスク切替(ページテーブル切替・コンテキスト切替)
  • メモリキャッシュヒット率低下
  • ディスクキャッシュヒット率低下

これらの要因の組み合わせで決まるので、結果は条件(主にプログラムの書き方)によって異なります。

一般には、1個ずつでも16個同時でもなく、数個同時に走らせた場合が一番速くなるケースがわりと多いです。

id:birdythemighty

丁寧にありがとうございます。

I/Oと演算の並列処理は、OSがやってくれるのですか?(うまく並列できるタイミング実行してくれるものなのでしょうか?)

2006/06/01 00:07:37
id:kurukuru-neko No.7

回答回数1844ベストアンサー獲得回数155

ポイント17pt

並列にプログラムを動作させた場合、より高速に

処理が完了するかかの目安として

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,最大メモリー使用量,

ページング回数を選択する事により確認できる。

(詳細データを取りたい場合は、管理ツールの

パフォーマンスモニターを使う)

id:birdythemighty

丁寧にありがとうございます。

元の質問からは脱線してしまうのですが、

grid は早いのでしょうか??

あまってる計算機を利用するという点ではすばらしいのですけど、通信が大きなボトルネックになるような気がします。

みなさま、ありがとうございました。

並列処理の場合、プロセスの切り替えとI/Oが

ボトルネックになりそうということがわかりました。どうもありがとうございました。

2006/06/01 00:14:44
  • id:kurukuru-neko

    GRIDは使い方しだいです。

    普通は、GRIDは単独CPUでは不可能な
    並列処理を実行するのによく使われています。

    通信が多量に発生するようなものは、PCのGRIDには
    むかないですね。

    有名なのは、
     暗号解析コンテスト
       http://stats.distributed.net/  

     SETI@home
       http://www.planetary.or.jp/setiathome/
     
     http://e-words.jp/w/E382B0E383AAE38383E38389E382B3E383B3E38394E383A5E383BCE38386E382A3E383B3E382B0.html

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません