単一のスレッドがCPU全体に広がるのはなぜですか?


24

スケジューラがアプリをCPUに保持するのではなく、CPU間で絶えず移動する理由に興味があります。100%ではなく25%で4つのコアを持つのは少しばかげているように見えます。

熱に関係しているのでしょうか、それともどういうわけかより効率的ですか?他のOSの動作は異なりますか?

洞察または詳細なものへのリンクはいいでしょう。(自分自身を見つけることができませんでした。)

更新:

「広げる」とは、一度に複数のCPUで実行されることを意味するのではなく、1秒間に1つから他のCPUに数回移動していることを意味します。


3
「他に何も実行されていない」場合でも、CPUを奪い合うシステムスレッドが常に存在します。たとえば、O / Sには、再利用されたメモリページをゼロにするスレッドがあるため、メモリが必要な場合、いくつかのページをすぐに使用できます。スレッドが再び実行されると、これらのスレッドの1つが使用していたCPUを使用している可能性があります。OSは何をすべきですか?それを待つか、新しいCPUに移動しますか?それが何をするにしても、場合によっては望ましくない動作をすることになります。
トニー・リー

クンバです。LBPではなくSMB。:)
マッケ

私の「答え」では、説明したとおりに動作するシングルスレッドプログラムを示しました。つまり、「1秒間に数回、一方から他方に移動し、広がるように見える効果があります」。
エヴァンロシカ

回答:


8

wierobはその点をかなりよく説明していると思います。クアッドコアQX6800の設定について説明し
古い記事がありprocessor affinityます。 (リンクはその記事の2ページ目を指します)。

プロセスアフィニティをコアに強制しない場合、パフォーマンスが低下しますか?

  • 一方で、Windowsのスケジューラは、キャッシュで回避スラッシングに、このような親和性を決定する必要があり、プロセッサの設計自体にも、そのような事を考えています。
  • Intel QX6800クアッドコア(この回答の前半で言及したため)に
    は、4つのコア間で共有される8MB L3キャッシュがあります。

システム上でこの1つのシングルスレッドプロセスのみを実行することを選択した場合でも、OS自体には、スケジュールが必要な他のタスクがいくつか実行されることに注意してください。スケジューラは、利用可能なプロセッサプール(またはコア)全体でこのすべてのアクティビティのバランスをとります。


今後、NehalemアーキテクチャとNUMA
使用すると、複数のソケットにまたがるプロセッサもアクセススラッシュに対処できるようになります。NUMAのArsTechnicaページ
からの簡単な写真です。

ここに画像の説明を入力してください

ネハレムとi7あなたが興味を持っている場合、私はこの答えにいくつかのリンクがあります


「NehalemアーキテクチャとNUMAを使用して、複数のソケットにまたがるプロセッサもアクセススラッシュに対処できるようになる」と考える理由 ?NUMAを使用すると、メモリがさらにローカルになり、特定のプロセッサに関連するようになるため、トラッシングの影響が悪化します。
ローランドピフラカス

@RolandPihlakas、この答えからしばらく経ちましたが、arstechnicaの記事とこれらのポイントを見ると、新しいプラットフォームのメモリ接続性が向上し、ソフトウェアがそれを利用する能力を考慮していたと思います(そのオプションはありません)その時点での複数のソケット構成、つまりNehalemの前)。
ニック

6

スケジューラは、「空き」コア/ CPUで実行可能な次のスレッドを実行するだけです。

Windowsタスクマネージャーを使用して、特定のCPUにプロセスを割り当てることができます。

25%の4つのコアを持つことは、4つのスレッドが同時に実行されることを意味します。一方、x%の1つのコアは、1つのスレッドのみが実行されることを意味します。したがって、前者の方が効率的な場合があります。

しかし、その実行中、CPUのキャッシュはスレッドによってアクセスされるデータで満たされます。そのため、スレッドが別のCPUで実行されると、データがこのCPUのキャッシュにないため、より多くのキャッシュミスが発生し、コストがかかります。

あなたのスレッドは何をしますか?スレッドが非常に短い時間「スリープ」する場合、それが実行されていたコアが別の脅威によって占有されている可能性があるため、スレッドは次に利用可能なコアで実行されます。プロセスで使用するコアを1つだけ指定した場合(例:タスクマネージャー)はどうなりますか?


3
afaik Windowsスケジューラは、この問題を回避するために、スレッドを同じCPU /コアに保持している間、かなり良い仕事をします。
パクシ09

@Pär:私のスレッドは実際に各コアで実行されているようです。
マッケ

ええ、おそらく私のスレッドにぶつかるのはOSプロシージャです。2つの答えを受け入れる方法は?:)
マッケ

@PärBjörklundは、少なくともWindows XPにはありません。「キャッシュバウンシング」の問題はVista以降で修正されたと思う
-Waxhead

1
「25%の4つのコアを持つことは、4つのスレッドが同時に実行されることを意味します。」いいえ、1つのスレッドが実行され、1つのコアで少し実行された後、別のスレッドが実行されます。タスクマネージャーは平均使用率を示すため、各コアについて25%(4コアシステムでは2コアシステムでは50%)を示します。これは、コアが4分の1の時間を完全に使用し、残りの時間はアイドル状態だったことを意味します。
デビッドバラジック16

0

そうではありません。1つのスレッドは1つのプロセッサでのみ実行できます。ただし、一部のプロセスには複数のスレッドがあり、それらは分散している場合があります。

推論は、それを信じるかどうかにかかわらず、それがどのように見えるかを決して考えませんでした。システムは、いつスパイクが発生するかを知る方法がないため、スレッドを広げようとします。


1
追加された説明を参照してください。これはフルスロットルで実行される1つのスレッドであり、時間の経過とともに、各コア(前方)が25%ビジーになるようにすばやく移動されます。(他のすべてのプロセス/スレッドがごくわずかです)
マッケ

0

OSはCPUコア間でスレッドを移行します(1秒間に数回)。常に同じコアで実行する方が効率的です。これは、タスクマネージャーの[アフィニティの設定]コンテキストメニュー項目によって実行できます。

通常(通常の家庭での使用)違いは数パーセントの範囲内であることに注意してください。

「使用率が25%の4つのコア」とは、タスクマネージャーが平均使用率を示すため、各コアが4分の1の時間で完全に使用され、残りの時間は無料であることを意味します。

説明はWindows用ですが、他のオペレーティングシステムでも同様です。


-1

誰かがまだこれを読んでいるなら、私もこれに気づき、それが単なるまぐれではないかどうかを確認するためにかなりの数のテストを実行しました。違います!単一のスレッドをすべてのコアに分散させる方が、いくつかの理由でより効率的だと思います。

  1. 1つのスレッドをすべてのコアに分散すると、消費電力を削減できます。ほとんどのプロセッサは負荷に応じて周波数を下げ、さらに重要なことに、負荷に応じて電圧を下げるため、たとえば、コア2クワッドは、1つのコアを使用するのではなく、4つのコアすべてに1つのスレッドを分散させることにより、消費電力と発熱量を大幅に削減します(これにより、電圧レギュレーターが1つしかないため、すべてのコアで電圧が上昇します*-これはかなり効果的ではありません)。
  2. これにより、スレッドは常に最大/一定速度で実行されます。スレッドが突然より多くの処理能力を要求すると、1つのコアが過負荷になり、実行に遅延が生じる可能性があります。コア全体に拡散することにより、突然のスパイクはラグや遅延なしにスムーズに処理されます。

また、上記の2つの観察のため、ターボブーストとIDAは効果がないと信じるようになりました。古いオペレーティングシステムでは便利かもしれませんが、LinuxとWindows 7はすべてをすべてのコアに効率的に分散しています。そのため、Core 2 Quad q9100 @ 2.26 GHzは常に(常に例外があります:-) Core 2 Duo X9100 @ 3.06GHzよりも常に高速であり、IDA(基本的にターボブーストの前身)を使用することはめったにありません。シングルスレッドアプリの場合のみ、1つまたは2つのコアの頻度を増やします)。

  • コア2クワッドには2つのクロックドメインがあります。物理ダイが2つあるため、2つのコアはフル周波数で動作し、2つは最低周波数で動作します。電圧レギュレーターが2つあるかどうかはわかりませんが、4つのコアすべてで電圧が均一であることに気づいたので、パッケージ全体でレギュレーターは1つだけでなければなりません。

3
これはいくつかの理由で疑わしいと思われます。あなたの「事実」への参照を提供してください。まず、4つのコアで25%のコンピューティングスタッフが1つのコアで100%未満の電力を消費するのはなぜですか?(私は熱がより均等に広がることに同意することができますが...)また、私の質問のスレッドはフルティルト(100%)で実行されているので、既に処理しているため、「より多くの処理能力を要求」しませんできるだけ。
マッケ

まあ、それは私自身の観察からです-IDAとTurboBoostに興味があり、いくつかのテストを行うことにしました。かなり前のことですが、上記の結論に到達しました。すべてのコアがより低い電圧で動作するため、プロセッサの消費電力は低くなります-0.1Vの削減により、消費電力を約6〜10ワット節約します(1つのコアに100%の負荷がかかると、アイドリング状態にかかわらず、すべてのコアがより高い電圧で動作しますか否か)。これは、SLFMモードのCore2Duoで特に当てはまります。プロセッサのタクトを要求することなくフルティルトで実行されるスレッドについては正しいのですが、実際にこれを行うアプリがあります。
JakL

「スレッドを広げる」などというものはありません(いいえ、5年後でもありません)。1つのコアで実行される単一のスレッドがあります。そしてその後、別の。等々。各瞬間に、1つのコアが100%で実行され、他のコアはアイドル状態です。したがって、節約はありません。特に、とにかくすべてのコアが常に電圧である場合(おっしゃるように、電圧を共有しています)。また、すでに述べたように、同じコア上に存在することにより、スレッドが存在するすべての処理能力を確保できます。そのコアは既に100%使用されているため、OSは他のスレッドを、使用率の低い他のコアにスケジュールします。
デビッドバラジック16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.