Логическое количество процессоров возвращает 16 вместо 4

У меня Intel Core i5-2450m (2 физических процессора и 4 логических процессора), и я хочу найти способ подсчета логических и физических ядер на процессорах AMD и Intel.
Но после некоторых поисков я заметил что-то странное. Вместо того, чтобы возвращать 4 логических модуля, мой код дает мне 16.

static int8_t LogicalProcCount(void)
{
if ( !Hyperthreading )
return 1;

uint32_t unused, ebx;
CPUID(1, unused, ebx, unused, unused);

return (int8_t) ( (ebx >> 16 ) & 0xFF );
}

2

Решение

CPUID.1:EBX[23:16] представляет максимальное количество адресуемых идентификаторов (начальный идентификатор APIC), которые могут быть назначены логическим процессорам в физическом пакете.

Источник.

Таким образом, 16 не имеет никакого отношения к фактическому количеству ваших логических процессоров. На моей машине CPUID.1:EBX[23:16] также возвращает 16, хотя он имеет 8 логических процессоров.

Пример кода для подсчета фактических логических процессоров также можно найти в связанном документе.

6

Другие решения

Более полным ответом было бы то, что для процессоров Intel, выпущенных до 2010 года, такой код обычно был в порядке. (Хотелось бы услышать о контрпримерах!) Такого рода процедуры подсчета были даны даже в более старой презентации Intel, выпущенной в 2007 году (?) Или около того. https://software.intel.com/en-us/articles/hyper-threading-technology-and-multi-core-processor-detection (Не позволяйте дате публикации дурачить вас; когда эта презентация была сделана, Intel Core еще не был общедоступным, а Pentium Extreme Edition был лучшим предложением Intel.) Как ни прискорбно, этот алгоритм все еще приводится на странице MSDN о __cpuid даже для их издания 2013 года! (http://msdn.microsoft.com/en-us/library/hskdteyh.aspx) Пример кода MSDN не обновлялся с 2008 года …

В начале 2010 года Intel выпустила процессоры Westmere с пробелами в пространстве идентификаторов APIC. Таким образом, эти и последующие процессоры нуждаются в более совершенном методе подсчета их ядер. Все эти процессоры имеют x2APIC и также поддерживают лист 0xB cpuid … который может рассказать вам о пробелах в пространстве идентификаторов APIC через EAX [4: 0] и точно, сколько логических процессоров присутствует на каждом уровне (package / ядро) через EBX. Ссылка предоставлена ​​n.m. авторитетный, хотя и довольно сухой. По сути, все, что вам нужно сделать, это вызвать cpuid с EAX = 0xB, ECX = 1, и вы получите правильное количество логических процессоров на пакет, возвращенное в EBX.

Кроме того, часть вопроса о AMD не получила ответа. У AMD другая методология, потому что они не поддерживают те же листья процессора, что и у Intel. Самая актуальная информация, которую я мог найти о AMD (с 2013 года), находится на http://developer.amd.com/resources/documentation-articles/articles-whitepapers/processor-and-core-enumeration-using-cpuid/

Кстати, я откопал всю эту информацию во время обновления страницы Википедии о CPUID сегодня.

2