私は数を処理するアプリケーションに取り組んでおり、可能な限りすべてのパフォーマンスを絞り出そうとしています。Windows と *nix の両方、さらにはマルチ CPU マシンでも動作するように設計しています。
私が現在セットアップしている方法では、OS にいくつのコアがあるかを尋ね、各コアのアフィニティを CPUID ASM コマンドを実行する関数に設定します (はい、同じ CPU で複数回実行されます。大したことはありません)。 、これは単なる初期化コードです)、CPUID の Features 要求で HyperThreading をチェックします。CPUID コマンドへの応答から、実行すべきスレッド数を計算します。もちろん、コア/CPU が HyperThreading をサポートしている場合、1 つのコアで 2 つ生成されます。
しかし、自作マシンで分岐案件に遭遇。Core 2 Duoを搭載したHPラップトップを実行しています。しばらく前に工場出荷時のプロセッサを、HyperThreading をサポートするより優れた Core 2 Duo に交換しました。ただし、工場出荷時のプロセッサがサポートしていなかったため、BIOS はサポートしていません。そのため、CPU がハイパースレッディングを持っていると報告しても、それを利用することはできません。
Windows では、論理コアを数えるだけでハイパースレッディングを検出できることを認識しています (物理的なハイパースレッディング対応コアは 2 つの論理コアに分割されているため)。ただし、そのようなものが *nix (特に Linux; 私のテストベッド) で利用できるかどうかはわかりません。
デュアルコア プロセッサで HyperTreading が有効になっている場合、Linux 関数 sysconf(_SC_NPROCESSORS_CONF) は、プロセッサが 4 つあることを示しますか、それとも 2 つしかないことを示しますか?
両方のシステムで信頼できるカウントを取得できれば、CPUID ベースのハイパースレッディング チェックをスキップして (結局のところ、BIOS で無効になっている/利用できない可能性があります)、OS が報告するものを使用できますが、残念ながら私のせいで分岐ケースこれを判断できません。
PS: コードの Windows セクションでは、GetLogicalProcessorInformation() の戻り値を解析しています。
おまけ: CPU を実際にハイパースレッド化できるように BIOS を変更する方法を知っている人はいますか ;)? マザーボードは、AMD M96 チップセットを搭載した HP 578129-001 です (yuck)。