CPUID на процессорах Intel i7 - PullRequest
       42

CPUID на процессорах Intel i7

5 голосов
/ 30 октября 2009

У меня проблема с моим кодом на базе 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 Ответ

5 голосов
/ 04 ноября 2009

Интересный вопрос - к сожалению, у меня нет i7, чтобы играть с ним, поэтому я могу только догадываться здесь.

Может быть полезно взглянуть на эту статью - хотя в принципе ваш подход кажется правильным, в них изложено несколько предостережений. Может быть, прочитайте и посмотрите, может ли на каком-то этапе ваши предположения могут быть неверными. Они по существу используют CPUID.1.EBX [23:16] (max # log процессоров в физическом пакете), CPUID.4.EAX [31:26] +1 (max # ядер в физическом пакете) и CPUID.4 .EAX [25:14] +1 (максимальное количество процессоров журналов в физическом пакете, совместно использующих кэш целевого уровня), чтобы вывести топологию процессора - что соответствует тому, что вы делаете.

Во-вторых, в качестве альтернативы, на процессоре, который поддерживает функцию CPUID EAX = 0Bh (см. Документация Intel здесь ), вы можете использовать эту функцию вместо того, чтобы получить нужные спецификации. Может быть, сравнение результатов двух подходов может быть осветительным?

- Edit-- Это - очень полезная статья, которая охватывает оба подхода, описанных выше. По сути, я понимаю, что на i7 CPUID.0B является предпочтительным вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...