プロが教えるわが家の防犯対策術!

ハイパースレッディングで複数の数値計算を完了する時間は速くなるのでしょうか?

例えば、Core i7 だと
・コアが4つ
・スレッドが8つ(1コア2スレッド)
となっています。

時間のかかる数値計算のプログラム(ロケットの軌道の計算など)をパラメータ(初期条件など)を変えて8つ計算したい時、

(1)8つの計算を一気に計算する

のと

(2)4つずつ、2回に分けて計算する

のではどちらが効率がよい、あるいは、速く終了するでしょうか?

ハイパースレッディングについての説明を読みました。あまり分かり易いものがなかなか見つからなかったのですが、↓ここを見て何となく原理が分かりました。
http://shop.tsukumo.co.jp/special/030626a/
これをみると、作業をする人(?)がハイパースレッドだとスレッド倍になるので、(1)のように、1つのコアに1つの作業をさせるより2つの作業をさせた方が良いのかなとも思います。

よろしくお願いします。

A 回答 (5件)

>●2コアと2スレッドにはたいした違いはない


同じコアの場合
2コアとハイパースレッディングが有効な1コア(論理2コア)では、物理的に2コアある前者の方が高速です。

現在のCore i7はわかりませんが、過去にはハイパースレッディングが原因で
パフォーマンスが落ちる事を指摘された事があったようです。
http://japan.cnet.com/news/ent/story/0,200005602 …

ただ一般的にはCore i7 4コア(HT)であれば、計算が非同期で動く事を前提にした場合
同じ処理を並列で4スレッド2回走らせるよりも並列8スレッド1回で処理をした方が高速になります。
※既に回答にもありますがWindowsの場合そのときのバックグラウンドで走っているアプリの状況や
 その処理自体がCPUキャッシュにヒットしやすいかどうか等
 の影響を受けるので一概にどの方法が高速かは言い切る事は出来ません。
    • good
    • 0

一概に言えないというのが回答になりますが、何故プログラムが遅くなるのかを考えると、わかるかと思います。



細かいことを除くと、計算がメインであるようなプログラムが時間がかかる原因は大きく3つ。(計算自体にかかる時間は除いての話ですが)
(1) CPUの空きがない(他のプログラムが実行中)ので空きが出るまで待つ
(2) メモリが足りないので、ディスク上のページファイルとの間でやりとりが発生するがそのときのディスクとのデータ入出力処理や、データ入出力待ち
(3) ファイルと計算データを入出力する際のディスクとのデータ入出力処理や、データ入出力待ち

このうち、マルチCPUやマルチコアやマルチスレッドのおかげで速くなるのは(1)の部分だけです。

ということで、例えば、搭載メモリが2GBとかあって、1つのプログラムの使うメモリ量が10MBとかのとっても小さいプログラムで、計算中にファイル入出力もないというケースであれば、8つのプログラムを同時に動かすと良いです。

同じく搭載メモリが2GBでも、1つのプログラムが使うメモリが1GBとかだと、おそらく1つずつ8回動かした方が良い。これは(2)で遅くなるのを防ぐためです。もしかすると2つずつ4回が良いかもしれませんが。
    • good
    • 0
この回答へのお礼

ありがとうございます!

> 例えば、搭載メモリが2GBとかあって、1つのプログラムの使うメモリ量が10MBとかのとって
> も小さいプログラムで、計算中にファイル入出力もないというケースであれば、

まさにそういう状況を想定していました!


> 8つのプログラムを同時に動かすと良いです。

そうなのですね。

こういった状況・用途の計算の場合は、例えば、

●2コアと2スレッドにはたいした違いはない

と考えて良いのでしょうか。(誤解していたらすみません・・)

お礼日時:2010/05/21 22:53

折角なので、その「発送センター」の絵を使って説明しましょう。



4コア、というのは、このコンベアが4つある状態です。
1コア2スレッド、というのは、作業員が2人いる状態です。

たしかに、コンベアが4つあれば4倍の荷物を処理できそうですし、二人でやったら2倍処理できそうです。

しかし、次の場合はどうなるでしょうか?
・トラックが1台しかない
・赤いトラックに積む荷物はたくさんあるのに、他のトラックの荷物はほとんどない
・赤い荷物はとても重いので、コンベアから取り出すのに時間がかかる。その間、青い作業員は待つしかない

いずれも、作業効率が落ちます。
そんなことにならないように、管理部が効率よくなるように計画書を作って、現場監督がその通りに実行する必要があるわけです。
トラックが1台の場合なら、トラックに全作業員が押し寄せて邪魔になそうなので、順番にやったり、一人でやったりという指示が必要でしょう。
一つのトラックに集中するなら、他のトラックに荷物をまわすことを考えた方がいいでしょう。
赤い荷物が重かったら、分担しないで、二人で赤青両方した方が早いかもしれません。

プログラムでも同じことが言えます。
プログラマーが効率を考えてプログラムを作って、コンピュータが実行して、はじめてマルチコア/マルチスレッドの効果があります。



white-tiger

困ってます
ハイパースレッディングで複数の数値計算を完了する時間は速くなるのでしょ

ハイパースレッディングで複数の数値計算を完了する時間は速くなるのでしょうか?

例えば、Core i7 だと
・コアが4つ
・スレッドが8つ(1コア2スレッド)
となっています。

> 時間のかかる数値計算のプログラム(ロケットの軌道の計算など)をパラメータ(初期条件など)を変えて8つ計算したい時、
> (1)8つの計算を一気に計算する
> のと
> (2)4つずつ、2回に分けて計算する
> のではどちらが効率がよい、あるいは、速く終了するでしょうか?

一概には言えません。計算量を見積ってどれがいいかを検討する必要があります。
8つのうち、7つはパラメータが悪く、すぐ落下するので計算が短い、となれば、(2)のようにしてまともな1つにパワーを集中させるのがはやいでしょう。
どれも同じくらいなら、8つに分散するのがおそらくいいでしょう。
    • good
    • 0
この回答へのお礼

非常に分かり易い説明をありがとうございます!!!

あと、言葉足らずでした。すみません。
・マルチスレッド・並列計算のプログラムはしない(シングルスレッドのプログラム)
・計算時間は同じくらいの8つのプログラム
というのが前提にしたいことでした。

> どれも同じくらいなら、8つに分散するのがおそらくいいでしょう。

そうなのですね。
思ったのは、上記の例で言うと、
「1つのトラックの取り合い」にならないのかな、というのが自分の疑問だったのだろうと思います。

お礼日時:2010/05/21 22:49

http://www.katto.comm.waseda.ac.jp/~katto/Class/ …

マルチスレッドに対応するようにプログラミングしないかぎり、シングルスレッドのプログラムと変わりません。
なお、マルチスレッド対応にしてもオーバヘッド等が掛かりますので、2つの(仮想)コアを使ったとしても性能は倍にまでは届きません。
    • good
    • 0
この回答へのお礼

言葉足らずでした。すみません。
・マルチスレッド・並列計算のプログラムはしない(シングルスレッドのプログラム)
・計算時間は同じくらいの8つのプログラム
というのが前提にしたいことでした。

お礼日時:2010/05/21 22:45

プログラムの作りに依存します。

複数のスレッドで計算をするように作られていれば、ハイパースレッドが有効になります。
    • good
    • 0
この回答へのお礼

言葉足らずでした。すみません。
・マルチスレッド・並列計算のプログラムはしない(シングルスレッドのプログラム)
・計算時間は同じくらいの8つのプログラム
というのが前提にしたいことでした。

お礼日時:2010/05/21 22:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!