私は独自のマルチスレッド C プログラムを持っており、CPU コアの数に合わせてスムーズに速度を調整できます..1、2、3 などのスレッドで実行でき、線形スピードアップを得ることができます..6 コアで最大約 5.5 倍の速度Ubuntu Linux ボックスの CPU。
Red Hat Enterprise Linux を実行する 4 つのクアッドコア Xeon プロセッサを搭載した非常にハイエンドな Sunfire x4450 でプログラムを実行する機会がありました。16 スレッドで私のプログラムを 16 コアでどれだけ速く実行できるか楽しみにしていましたが、2 つのスレッドと同じ速度で実行されます。
後で非常に頭を悩ませてデバッグすると、私のプログラムが実際にすべてのスレッドを作成していて、実際には同時に実行されていることがわかりますが、スレッド自体は本来よりも遅いです。2 スレッドは 1 よりも約 1.7 倍速く実行されますが、3、4、8、10、16 スレッドはすべて正味 1.9 倍で実行されます! すべてのスレッドが実行されている (ストールまたはスリープ状態ではない) ことがわかりますが、単に遅いだけです。
ハードウェアに問題がないことを確認するために、プログラムの 16 個のコピーを個別に同時に実行しました。彼らは皆、全速力で走った。実際には 16 個のコアがあり、それらは実際にフル スピードで実行され、十分な RAM があります (実際、このマシンには 64 GB があり、プロセスごとに 1 GB しか使用しません)。
したがって、私の質問は、オペレーティングシステムの説明があるかどうかです。おそらく、スレッドスケジューリングを自動的に縮小して、1つのプロセスがマシンを占有しないようにするプロセスごとのリソース制限です。
手がかりは次のとおりです。
- プログラムがディスクまたはネットワークにアクセスしません。それはCPUの制限です。その速度は、1 ~ 6 スレッド用のヘキサコア i7 を備えた Ubuntu Linux の単一の CPU ボックスで直線的にスケーリングします。6 スレッドは実質的に 6 倍のスピードアップです。
- 私のプログラムは、この 16 コアの Sunfire Xeon ボックスで、2 から 16 の任意の数のスレッドで 2 倍のスピードアップよりも速く実行されることはありません。
- 私のプログラムの 16 個のコピーをシングル スレッドで実行すると、完全に実行され、16 個すべてが一度に全速力で実行されます。
- top は、割り当てられた CPU の 1600% を示しています。/proc/cpuinfo は、16 個のコアすべてが 2.9GHz の最大速度で実行されていることを示しています (1.6GHz の低周波数アイドル速度ではありません)。
- 48 GB の RAM が空き、スワッピングではありません。
何が起こっていますか?プロセスの CPU 制限ポリシーはありますか? もしそうなら、どうすればそれを測定できますか?この動作を他に説明できるものは何ですか?
これを解決するためのアイデアをありがとう、2010 年の大 Xeon スローダウン ミステリー!