Возврат логического ЦП 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 );
}

Ответ 1

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

Источник.

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

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

Ответ 2

Более полным ответом было бы то, что для процессоров 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, которые имеют пробелы в своем пространстве id APIC. Таким образом, эти и более поздние процессоры нуждаются в более изысканном способе подсчета своих ядер. Все эти процессоры имеют x2APIC и поддерживают лист 0xB cpuid..., который может рассказать вам о пробелах в пространстве id APIC через EAX [4: 0] и точно, сколько логических процессоров присутствует на каждом уровне (пакет/ядро) через EBX. Ссылка, предоставленная n.m. является авторитетным, хотя и довольно сухим. В основном все, что вам нужно сделать, это вызвать cpuid с EAX = 0xB, ECX = 1, и вы получите правильное количество логических процессоров на пакет, возвращенный в EBX.

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

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