CPUID на процессорах Intel i7
У меня проблема с моим кодом на основе CPUID на новых машинах на базе i7. Он обнаруживает, что процессор имеет одно ядро с 8 модулями HT вместо 4 ядер, каждый с двумя блоками HT.
Я должен неправильно интерпретировать результаты информации CPUID, возвращающейся с CPU, но я не вижу, как это сделать.
В основном, я повторяю каждый процессор, видимый для 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; }
Эта последовательность повторяется для остальных процессоров в системе.
Кто-нибудь сталкивался с этим раньше?
Ответы
Ответ 1
Интересный вопрос - к сожалению, у меня нет i7 для игры, поэтому я могу только догадываться здесь.
Может быть полезно взглянуть на в этой статье - в принципе ваш подход кажется правильным, они указывают несколько оговорок. Возможно, прочитайте и посмотрите, не может ли быть на каком-либо этапе любое из ваших предположений. Они по существу используют CPUID.1.EBX [23:16] (max # log-процессоры в физическом пакете), CPUID.4.EAX [31:26] +1 (максимальное количество ядер в физическом пакете) и CPUID.4.EAX [25:14] +1 (максимальное количество журнальных процессоров в физическом пакете, использующем кеш целевого уровня), чтобы вывести топологию процессора, что соответствует тем, что вы делаете.
Во-вторых, в качестве альтернативы, на процессоре, поддерживающем функцию CPUID EAX = 0Bh (см. Intel docs here), вы можете использовать это вместо этого, чтобы получить нужные вам спецификации. Может быть, сравнение результатов двух подходов может освещать?
- Edit--
Это - очень полезная статья, которая охватывает оба вышеупомянутых подхода. По сути, я понимаю, что на i7 предпочтительным вариантом является CPUID.0B.