6

新しい i7 ベースのマシンで CPUID ベースのコードに問題があります。CPU が、それぞれ 2 つの HT ユニットを備えた 4 つのコアではなく、8 つの HT ユニットを備えた単一のコアを持つものとして検出されます。

CPU から返される CPUID 情報の結果を誤解しているに違いありませんが、その方法がわかりません。

基本的に、Windows から見える各プロセッサを反復処理し、スレッド アフィニティをそのスレッドに設定してから、一連の CPUID 呼び出しを行います。

args = new CPUID_Args();
args.eax = 1;
executeHandler(ref args);
if (0 != (args.edx & (0x1 << 28)))
{
  //If the 28th bit in EDX is flagged, this processor supports multiple logical processors per physical package
  // in this case bits 23:16 of EBX should give the count.
//** EBX here is 0x2100800
  logicalProcessorCount = (args.ebx & 0x00FF0000) >> 16;
//** this tells me there are 16 logical processors (wrong)
}
else
{ logicalProcessorCount = 1; }
apic = unchecked((byte)((0xFF000000 & args.ebx) >> 24));

if (maximumSupportedCPUID >= 4)
{
  args = new CPUID_Args();
  args.eax = 4;
  executeHandler(ref args);
//EAX now contains 0x1C004121
  coreCount = 1 + ((args.eax & 0xFC000000) >> 26);
//This calculates coreCount as 8
}
else
{ coreCount = 1; }

このシーケンスは、システム内の残りの CPU に対して繰り返されます。

誰もこれに直面したことがありますか?

4

1 に答える 1

5

興味深い質問です。残念ながら、私は i7 を持っていないので、ここでは推測するしかありません。

この記事を見ると役立つ場合があります。原則として、あなたのアプローチは正しいように見えますが、いくつかの注意事項が記載されています。たぶん、読んで、どの段階でもあなたの仮定が間違っている可能性があるかどうかを確認してください. 基本的に、CPUID.1.EBX[23:16] (物理パッケージ内の最大ログ プロセッサ数)、CPUID.4.EAX[31:26]+1 (物理パッケージ内のコアの最大数)、および CPUID.4 を使用します。 .EAX[25:14]+1 (ターゲット レベル キャッシュを共有する物理パッケージ内のログ プロセッサの最大数) プロセッサ トポロジを推測します。

次に、代わりに、CPUID 関数 EAX = 0Bh ( Intel のドキュメントはこちらを参照) をサポートする CPU では、代わりにこの関数を使用して必要な仕様を取得できます。2 つのアプローチの結果を比較すると、明らかになるかもしれません。

--編集-- これは、上記の両方のアプローチをカバーする非常に役立つ記事です。基本的に、i7 では CPUID.0B が推奨される亜種であると私は考えています。

于 2009-11-04T11:56:34.947 に答える