マルチコア CPU の負荷が 100% 未満になるようにコードが並列化されている場合、それは単に I/O とミューテックスの期待によるものですか? それとも、キャッシュ ミスや RAM へのアクセス待ちなどの理由でしょうか?
4 に答える
あなたの質問の要点を理解しているかどうかわからないので、マルチスレッドアプリケーションがコアで利用可能な CPU パワーを 100% 使用しない理由を尋ねていると仮定します。
利用可能な容量の 50% (50% で 2 つのコア) を使用するマルチスレッド シェル ソートを作成したときに、他にほとんど何も起こらなかった場合でも同様のことが発生しました。つまり、両方のコアで 100% を使用することを期待していました。
アフィニティ関数を使用してスレッドを特定のコアに結び付けることで、問題を修正しました。2 コアのマシンでは、作成されるスレッドは 2 つだけです。並べ替えは、任意の数のコアを使用できるようになり (ただし、3 つのコアを超えて拡張することはできません)、それらすべてを 100% で実行できます。OS および関連プロセスによって行われる作業は、並べ替えによって行われる作業と比較してごくわずかです。スレッドはコアに結び付けられているため、OS はスレッドを管理する際に選択の余地がほとんどありません。
アムダールの法則と同期のオーバーヘッドが私の最初の疑いです。ある種の同期またはスレッド管理がある限り、常に発生します。
これがゼロに近いと仮定すると、このスレッドで取り上げられた他のすべてのものはゼロになる可能性があります. IO、キャッシュ、OS 干渉、HT などのハードウェアの問題 (Intel x86 の場合)、...
これをテストする良い方法の 1 つは、さまざまなタイプのアーキテクチャ (Intel、AMD、Power、Sparc、HT、非 HT) およびオペレーティング システムで実行するようにプログラムを移動し、動作が変化するかどうかを確認することです。これは、プログラムのコア動作を非常に効率的な方法で明らかにする傾向があります。
あなたのプロセスは実行中の唯一のプロセスではありません。OS カーネルを含むその他のプロセスは、数パーセントを消費します。コンテキストの切り替え、I/O の待機、およびミューテックスはその一部にすぎません。
CPU 使用率が 100% に達しない理由は数多く考えられると思いますが、お客様の環境に関する知識がなければ、正確な理由を特定することはできません。
CPU がハイパースレッド (HT) の場合、他の CPU 設計よりも多くの考慮事項があります。CPU の一部が重複しています。つまり、OS は物理コアを複数の論理コアとして認識します。これらの論理コアは、タスク マネージャーなどに表示されるものです。特定の状況では、CPU の複製されていない部分がボトルネックになる場合があります。これは、複製されたコンポーネントを 100% の使用率で実行できないことを意味する場合があります。
興味深いことに、Intel によると、HT CPU は、論理コアの数が 2 倍になっているにもかかわらず、非 HT CPU と比較して約 30% のパフォーマンス向上しかないとされています。