NT サービスを Intel Core2 ベースの Win2k3 マシンで実行し、すべての論理 CPU (プロセス アフィニティのすべてのビット) を反復処理する必要があります。そのために、GetProcessAffinityMask() を呼び出してシステム アフィニティ マスクを取得し、プロセスを各プロセッサに順番に切り替えます。
DWORD systemMask;
GetProcessAffinityMask( ... &systemMask );
DWORD processorId = 1;
while( systemMask != 0 ) {
SetProcessAffinityMask(... processorId );
Sleep( 1 ); // to be sure that it shifts to that processor
systemMask >>= 1;
processorId <<= 1;
}
各反復で、ここからコードを呼び出して、現在のプロセッサ APIC ID を取得します。問題は、プロセッサが異なると、同じ APIC ID が返される場合があることです。ドキュメントによると、システム内の各プロセッサは同一の ID を持つ必要があります。
これをデバッグしてみました-Windowsが実際にアフィニティを変更するかどうかを確認しました:
while( systemMask != 0 ) {
SetProcessAffinityMask(... processorId );
Sleep( 1 ); // to be sure that it shifts to that processor
DWORD tempAffinity;
GetProcessAffinityMask( ... &tempAffinity );
// run APIC id detection code here
systemMask >>= 1;
processorId <<= 1;
}
予想どおりのアフィニティ マスクが返されますが、APIC ID は異なるプロセッサでも同じである可能性があります。
この奇妙な状況に説明はありますか?