2017-12-27 12 views
2

私は16000のジョブを実行します。C++ std :: async:8コアと比較して4コアで高速

各ジョブは独立しています。共有メモリ、プロセス間通信、ロックまたはミューテックスはありません。

私はubuntu 16.06です。 C++ 11。インテル®Core™i7-8550U CPU @ 1.80GHz×8

私は、コア間でジョブを分割するためにstd :: asyncを使用します。

I 8(コアあたり2000)にジョブを分割する場合、私は4(コアあたり4000)にジョブを分割する場合、計算時間が145 あり、計算時間60

出力が後に低減されていますどちらの場合も同じです。

計算中にCPUを監視すると(ちょうどhtopを使用すると)、予想どおりに処理されます(最初の100%では8コア、2番目のケースでは100コアで4コアのみ使用されます)。

4つのコアがはるかに高速8

+3

コードは表示されません。 –

+3

あなたは8コアを持っていません、そのCPUはクワッドコアです。 – Mat

+0

さて、あなたは間違っている。それを間違える方法の1つは、最も遅いスレッドが完了するのを待つことです。その代わりに、より小さいパケットで計算ジョブを分割して、次に準備ができているスレッドで処理できるようにします。標準のプロデューサ - コンシューマアルゴリズムを見てください。 –

答えて

4

よりi7-8550Uは4つのコアと8つのスレッドを持つプロセスなぜ私は非常に混乱しています。

違いは何ですか? How-To Geek引用:

ハイパースレッディングは、消費者のPCにパラレル 計算をもたらすために、Intelの最初の試みでした。 ペンティアム4 HTの2002年のデスクトップCPUでデビューしました。その日のペンティアム4は の単一CPUコアしか搭載していなかったので、実際には の時間に1つのタスクしか実行できませんでしたすばやくタスクを完了して マルチタスキングのように思えました。ハイパースレッドが を補うように試みました。

ハイパースレッディングを使用する単一の物理CPUコアは、オペレーティングシステムに対して2つの論理的な CPUとして表示されます。 CPUはまだ単一のCPUなので、 ちょっとしたチートです。オペレーティングシステムはそれぞれのコアが の2つのCPUを認識していますが、実際のCPUハードウェアは各コアに対して1つの実行セットしか持っていません。 CPUは より多くのコアを持っていると思っており、独自のロジックを使ってプログラムの実行を高速化しています。 言い換えれば、オペレーティングシステムは、実際のCPUコアがそれぞれ の2つのCPUを見るようになります。

ハイパースレッディングを使用すると、2つの論理CPUコアが物理リソース を共有できます。 1つの仮想アドレス のCPUがストールして待機している場合、もう1つの仮想CPUは実行リソースを から借りることができます。ハイパースレッディングは、システムを高速化するのに役立ちますが、実際の追加のコアを持っているほど良いところはありません。

ジョブを利用可能な数よりも多くのコアに分割すると、大きなペナルティが発生します。

+0

私は次のようにしています: "ハイパースレッディングはシステムのスピードアップに役立ちますが、実際の追加コアを持つほど良いところはありません。" "[,,,]で拡張し、自分のC++コードでは、実際には遅くなります(または、このコードの構造に依存します)。そして、私たちは、OSを信じるよりも、CPUのスペックを読まなければなりません。 – Vince

+1

各ソフトウェアスレッドが100%のプロセッサ時間(待機なし)を必要とする場合、最適なスレッド数はコア数に等しくなります。それ以外の場合は、最適なスレッド数がはるかに多くなる可能性があります。論理プロセッサの数ではなく、コアの数をOSに照会する必要があります。 –

関連する問題