- ベストアンサー
ハイパースレッディングで数値計算を効率的に行う方法
- ハイパースレッディングを利用すると、複数の数値計算を効率的に処理することができます。
- コア i7 の場合、4つのコアと8つのスレッドがあります。時間のかかる数値計算を8つ行いたい場合、一気に計算する方法と4つずつ2回に分けて計算する方法があります。
- ハイパースレッディングを利用すると、1つのコアに2つのスレッドを立てることができるため、作業を並列化することで処理速度を向上させることができます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>●2コアと2スレッドにはたいした違いはない 同じコアの場合 2コアとハイパースレッディングが有効な1コア(論理2コア)では、物理的に2コアある前者の方が高速です。 現在のCore i7はわかりませんが、過去にはハイパースレッディングが原因で パフォーマンスが落ちる事を指摘された事があったようです。 http://japan.cnet.com/news/ent/story/0,2000056022,20091397,00.htm ただ一般的にはCore i7 4コア(HT)であれば、計算が非同期で動く事を前提にした場合 同じ処理を並列で4スレッド2回走らせるよりも並列8スレッド1回で処理をした方が高速になります。 ※既に回答にもありますがWindowsの場合そのときのバックグラウンドで走っているアプリの状況や その処理自体がCPUキャッシュにヒットしやすいかどうか等 の影響を受けるので一概にどの方法が高速かは言い切る事は出来ません。
その他の回答 (4)
- notnot
- ベストアンサー率47% (4900/10359)
一概に言えないというのが回答になりますが、何故プログラムが遅くなるのかを考えると、わかるかと思います。 細かいことを除くと、計算がメインであるようなプログラムが時間がかかる原因は大きく3つ。(計算自体にかかる時間は除いての話ですが) (1) CPUの空きがない(他のプログラムが実行中)ので空きが出るまで待つ (2) メモリが足りないので、ディスク上のページファイルとの間でやりとりが発生するがそのときのディスクとのデータ入出力処理や、データ入出力待ち (3) ファイルと計算データを入出力する際のディスクとのデータ入出力処理や、データ入出力待ち このうち、マルチCPUやマルチコアやマルチスレッドのおかげで速くなるのは(1)の部分だけです。 ということで、例えば、搭載メモリが2GBとかあって、1つのプログラムの使うメモリ量が10MBとかのとっても小さいプログラムで、計算中にファイル入出力もないというケースであれば、8つのプログラムを同時に動かすと良いです。 同じく搭載メモリが2GBでも、1つのプログラムが使うメモリが1GBとかだと、おそらく1つずつ8回動かした方が良い。これは(2)で遅くなるのを防ぐためです。もしかすると2つずつ4回が良いかもしれませんが。
- kmee
- ベストアンサー率55% (1857/3366)
折角なので、その「発送センター」の絵を使って説明しましょう。 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つに分散するのがおそらくいいでしょう。
お礼
非常に分かり易い説明をありがとうございます!!! あと、言葉足らずでした。すみません。 ・マルチスレッド・並列計算のプログラムはしない(シングルスレッドのプログラム) ・計算時間は同じくらいの8つのプログラム というのが前提にしたいことでした。 > どれも同じくらいなら、8つに分散するのがおそらくいいでしょう。 そうなのですね。 思ったのは、上記の例で言うと、 「1つのトラックの取り合い」にならないのかな、というのが自分の疑問だったのだろうと思います。
- ok-kaneto
- ベストアンサー率39% (1798/4531)
http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/thread.html マルチスレッドに対応するようにプログラミングしないかぎり、シングルスレッドのプログラムと変わりません。 なお、マルチスレッド対応にしてもオーバヘッド等が掛かりますので、2つの(仮想)コアを使ったとしても性能は倍にまでは届きません。
お礼
言葉足らずでした。すみません。 ・マルチスレッド・並列計算のプログラムはしない(シングルスレッドのプログラム) ・計算時間は同じくらいの8つのプログラム というのが前提にしたいことでした。
- SaKaKashi
- ベストアンサー率24% (755/3136)
プログラムの作りに依存します。複数のスレッドで計算をするように作られていれば、ハイパースレッドが有効になります。
お礼
言葉足らずでした。すみません。 ・マルチスレッド・並列計算のプログラムはしない(シングルスレッドのプログラム) ・計算時間は同じくらいの8つのプログラム というのが前提にしたいことでした。
お礼
ありがとうございます! > 例えば、搭載メモリが2GBとかあって、1つのプログラムの使うメモリ量が10MBとかのとって > も小さいプログラムで、計算中にファイル入出力もないというケースであれば、 まさにそういう状況を想定していました! > 8つのプログラムを同時に動かすと良いです。 そうなのですね。 こういった状況・用途の計算の場合は、例えば、 ●2コアと2スレッドにはたいした違いはない と考えて良いのでしょうか。(誤解していたらすみません・・)