Означает ли это, что непараллельный процесс будет работать медленнее на одном и том же тактовом процессоре с 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 вы должны были бы гуглить вокруг.