2009-10-29 11 views
5

最新のi7ベースのマシンでCPUIDベースのコードに問題があります。 CPUが、2つのHTユニットをそれぞれ有する4つのコアの代わりに、8つのHTユニットを有する単一のコアを有するものとして検出している。Intel i7プロセッサのCPUID

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で繰り返されます。

誰もこれに直面していますか?

+0

Hey StarPacker、私はこの特定の問題についてお手伝いできませんが、私には関連する質問があります: http://stackoverflow.com/questions/1666093/cpuid-implementations-in-c 私はいくつかの例のコードなどで正しいパスに私を置くことができるかどうか疑問に思っていました...私は実際にアプリケーションのCPUIDをX86/X64でサポートしています。 app私は開発中であり、仲間の研究者によって使用されます(私が直接アクセスすることができないマシンで私のコードを実行します)。乾杯、Kris – Kris

答えて

5

興味深い質問 - 残念ながら私は遊ぶi7がないので、私はここでしか推測できません。

this articleをご覧になると便利ですが、原則としてあなたのアプローチは正しいと思われますが、いくつかの注意点があります。多分あなたの前提が間違っているかもしれないかどうかを読んでみてください。基本的にCPUID.1.EBX [23:16](物理パッケージ内の最大ログプロセッサ)、CPUID.4.EAX [31:26] +1(物理パッケージ内の最大コア数)、およびCPUID.4 .EAX [25:14] +1(ターゲットレベルのキャッシュを共有する物理パッケージ内の最大ログプロセッサ数)で、プロセッサのトポロジを推測します。

第2に、CPUID機能EAX = 0Bh(Intel's docs hereを参照)をサポートするCPUでは、代わりにこの機能を使用して、必要な仕様を得ることができます。おそらく、2つのアプローチの結果を比較すると、明るいかもしれませんか?

- 編集- Thisは、上記の両方のアプローチをカバーする非常に有用な記事です。本質的に、私はi7でそれを集め、CPUID.0Bが優先されます。

+0

ありがとうございました。残念ながら、それはこの質問に完全に答えるので受け入れられませんでした。 – ttvd

+0

私はCPUID.1.EBX [23:16]が4ではなく16個の論理プロセッサを報告しているi5-560mで同じ問題を抱えています。なぜそれが間違った結果を返すのか分かりません。リンクされた最初の記事PhiSが答えを含んでいるかもしれないが、それは取り下げられた。他のリンクは本当に答えを提供していません。別の方法が働いても、最初のものがなぜそうしないのか、何らかの韻や理由がないようです。 : -/ –

+0

Ah - 実際にCPUID.1.EBX [23:16]が動作しない理由は2番目の記事にあります:AP-485が暗示しているのとは対照的に、実際には論理プロセッサの実数は返されません。 "CPUID.1:EBX [23:16]は、物理パッケージ内の論理プロセッサに割り当てることができるアドレス指定可能なIDの最大数(初期APIC ID)を表します。物理パッケージのハードウェアに存在しています。 ああ、最も単純なものは深く埋もれている...アプリケーション開発者がスレッドの実際の数よりも理論上の最大値についてもっと気にするように。 –

関連する問題