web-dev-qa-db-ja.com

単一のスレッドがCPU全体に分散しているのはなぜですか?

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

それは熱と関係がありますか、それともどういうわけかより効率的ですか?他のOSはそれを異なって行いますか?

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

更新:

「拡散」とは、一度に複数のCPUで実行されることを意味するのではなく、1秒間に数回、あるCPUから別のCPUに移動され、分散しているように見える効果をもたらします。

24
Macke

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

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

  • Windowsスケジューラは、キャッシュでのスラッシングを回避するために、そのようなアフィニティを決定する必要がありますが、
    プロセッサ設計自体もそのようなことを考慮します。
  • Intel QX6800クアッドコア(この回答の前半で参照したため)
    には4コアで共有される8MB _L3_キャッシュがあります。

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


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

enter image description here

Nehalemと_i7_に興味があれば、もう少し この回答へのリンク

8
nik

スケジューラーは、「空き」コア/ CPUで実行する準備ができている次のスレッドを実行するだけです。

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

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

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

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

6
wierob

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

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

「それぞれ25%の使用率で4つのコア」とは、タスクマネージャーが平均的な使用量を示しているように、各コアが4分の1の時間で完全に使用され、残りの時間を解放することを意味します。

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

0
David Balažic

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

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

0
tsilb