Windows (Windows 7、XP、および Vista) を使用しています。マルチスレッド プログラムを作成した場合、スレッドは使用可能なすべてのコアで実行されますか? 自動ですか?それは保証されていますか?
たとえば、4 つのスレッドと 4 つのプロセッサがある場合、スレッドは各プロセッサ/コアで 1 つずつ実行されますか?
Windows (Windows 7、XP、および Vista) を使用しています。マルチスレッド プログラムを作成した場合、スレッドは使用可能なすべてのコアで実行されますか? 自動ですか?それは保証されていますか?
たとえば、4 つのスレッドと 4 つのプロセッサがある場合、スレッドは各プロセッサ/コアで 1 つずつ実行されますか?
オペレーティングシステムは、スレッドの状態、優先度などに基づいて決定します。
スレッドがすべて異なるプロセッサで実行されることは保証されていません。実際、スレッドの実行順序が関係する保証はほとんどありません。それらはすべて同じプロセッサで実行される可能性があります。それらはすべて並行して実行される場合もあれば、まったく実行されない場合もあります。これは可能性が高いというわけではありませんが、保証はありません。
彼らはそうかもしれません。それは、OSまで、さまざまなコアを利用している可能性のある他のプログラムが実行されているかどうかによって異なります。
一言で言えば、OSはスレッドをかなり均等に分散しようとする必要がありますが、各スレッドが各コアにいつどのように配置されるかを予測しようとすることは無駄です。
複数のプロセッサに関するMSDNは、特定のプロセッサに特定のスレッドを強制する方法を説明しています。通常、オペレーティングシステムに依存しています。
GetSystemInfoを使用してプロセッサの数を照会できます。
この関数を使用して、どのスレッドをどのコアで実行できるかを制御できることを知りたいと思うかもしれませんSetThreadAffinityMask()
。
ただし、事実上すべての場合において、OSにコアへのスレッドの割り当てを管理させるのが最善です。非常に特殊な状況(コンテキストスイッチとその結果のキャッシュフラッシュによって悪影響を受ける高性能コードを実行している場合など)でのみ、スレッドアフィニティを手動で設定する必要があります。
デフォルトでは、作成するすべてのスレッドは、すべての CPU のすべてのコアで実行できます。ただし、スレッドはコンピューター内の唯一のスレッドではないため、これらのコアはスレッドで 100% 使用できるわけではありません。したがって、スケジューラはスレッドに利用可能な CPU パワーのかなりの部分を与えます。
スレッドはどこでも実行できるため、スレッドが別のコアが使用可能になるのを待っている間、コアが何もしていないという状況に遭遇することはありません。また、4 コアのマシンに 4 つの実行可能なスレッドがある場合、すべてのコアがビジー状態になることを意味します。注: I/O を待機している場合など、スレッドが常に実行可能であるとは限りません。