Означает ли это, что беспрецедентный процесс будет работать медленнее на одном и том же тактовом процессоре с 4-ядерным 8-поточным процессором, чем на 4-ядерном 4-поточном процессоре, поскольку он использует только половину ядра?
Вроде да и нет.
Если я запускаю 8 независящих однопоточных программ на 8-ядерном (8-ступенчатом) процессоре, то каждое ядро будет работать по одному шагу, и они будут работать на максимальной скорости (например, назначать все время, игнорируя такие вещи, как ОС, которая также требует некоторого времени процессора).
Если я запускаю 8 независимых однопоточных программ на 4-ядерном (4-шаговом) процессоре, то в среднем каждое ядро будет запускать две из них. Программа будет работать в два раза быстрее.
Пока что никаких сюрпризов.
Теперь с 4-ядерным процессором (8 протекторов) ОС считает, что имеется 8 ядер. Это будет топтать их как первый случай. Однако это не совсем так; половина ядер не построена как обычные ядра. Обычно дублируется только часть функциональности, и если вам не повезет, один из протекторов остановится. Это не будет быстрее, чем процессор 4c / 4t.
Однако, если вам очень повезло (например, ALU удваиваются, и вы чередуетесь между лечением, извлечением информации из памяти и добавлением), тогда оба могут работать на полной скорости.
В среднем Это приводит к увеличению скорости на 30%.
Чтобы сделать это еще более сложным: если ваши программы используют большие наборы данных, то запуск более 4 из них может привести к меньшему количеству обращений в кэш. Последнее действительно может замедлить ход событий.
Есть ли программный способ (скажем, уровень ОС), чтобы установить процессор только на 1 поток
на ядро?
Да, очередь гиперпоточности.
Вы можете сделать это в прошивке (например, в BIOS или в UEFI) или из ОС.
Например. для 8-процессорного 4-ядерного процессора с ядрами 0 1 2 3, являющимися первыми ядрами, и 4 5 6 7, представляющими собой набор с тредами, который вы можете использовать:
echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online
IIRC FreeBSD сделал то же самое с помощью syscontrol. Для OSX или Windows вам нужно будет погуглить.