Я предполагаю, что это из-за гиперпоточности.
Гиперпоточность не удваивает мощность процессора (по данным Intel, она добавляет в среднем около 30%), поэтому имеет смысл сначала распределить работу между физическими ядрами, а использовать гиперпоточность в крайнем случае, когда общая потребность в процессоре начинает превышать 50%. .
Забавный факт: заявленная 50-процентная общая загрузка ЦП в системе с гиперпоточностью на самом деле составляет около 70 %, а оставшиеся 50 % равны оставшимся ~ 30 %.
Если мы запросим у ОС, как логические процессоры назначены ядрам1, мы увидим такую ситуацию:
Core 0: mask 0x3
Core 1: mask 0xc
Core 2: mask 0x30
Core 3: mask 0xc0
. . .
Это означает, что логические процессоры 0 и 1 находятся на ядре 0, 2 и 3 на ядре 1 и т. д.
Вы можете отключить гиперпоточность в BIOS. Но поскольку это повышает производительность, приятно иметь эту функцию. Просто нужно быть осторожным, чтобы не закрепить работу так, чтобы она конкурировала за одно и то же ядро.
1 Чтобы проверить назначение ядра, я использую небольшую программу на C, приведенную ниже. Информация также может быть доступна через WMIC.
#include <stdio.h>
#include <stdlib.h>
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x601
#include <Windows.h>
int main() {
DWORD len = 65536;
char *buf = (char*)malloc(len);
if (!GetLogicalProcessorInformationEx(RelationProcessorCore, (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)buf, &len)) {
return GetLastError();
}
union {
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX info;
PBYTE infob;
};
info = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX)buf;
for (size_t i = 0, n = 0; n < len; i++, n += info->Size, infob += info->Size) {
switch (info->Relationship) {
case RelationProcessorCore:
printf("Core %zd:", i);
for (int j = 0; j < info->Processor.GroupCount; j++)
printf(" mask 0x%llx", info->Processor.GroupMask[j].Mask);
printf("\n");
break;
}
}
return 0;
}
person
rustyx
schedule
03.02.2021
Core 0: mask 0x3, Core 1: mask 0xc, Core 2: mask 0x30, Core 3: mask 0xc0
. К сожалению, godbolt не может запустить win32. - person rustyx   schedule 03.02.2021