Процессор редко бывает быстрым или медленным вообще. Он быстрый в одном режиме и посредственный в другом, а какой режим включится, определяет не он сам, а код, который на нём выполняется. Разделительная линия проходит просто: часть работы принципиально последовательна, часть распадается на независимые куски. Первое упирается в скорость одного ядра, второе — в их количество.

Из чего складывается скорость одного ядра

Ядро выполняет команды не по одной. Внутри него работает конвейер, способный запускать несколько операций за такт, предсказатель переходов, который угадывает ветвления заранее, и механизм внеочередного исполнения, переставляющий команды местами, чтобы не простаивать в ожидании данных. Суммарно это описывают числом команд за такт. Умножив на частоту, получаем скорость одного потока.

Ключевое ограничение здесь — зависимая цепочка. Если результат команды нужен следующей команде, никакая ширина конвейера не поможет: операции придётся выполнять последовательно, одну за другой. Задачи, состоящие из таких цепочек, разгоняются только двумя способами: поднять частоту или сделать саму цепочку короче за счёт более удачного алгоритма и лучшего предсказания переходов. Отсюда странное на вид явление: процессор с меньшим числом ядер обходит более многоядерную модель в задаче, где вся работа сводится к одной длинной последовательности вычислений.

Где количество ядер действительно работает

Параллельная задача разбивается на порции, которые не ждут друг друга. Рендер кадра по тайлам, сжатие видео по группам кадров, компиляция сотен файлов исходного кода, обработка запросов на сервере — каждый кусок считается отдельно, результаты собираются в конце. Здесь добавление ядер даёт почти линейный прирост, пока не упрётся в другой ресурс.

Но идеального масштабирования не бывает. Всегда остаётся последовательная часть: разбор задания, распределение работы, сборка результата, запись на диск. Чем больше ядер, тем заметнее эта часть в общем времени. Удвоение числа ядер, если десятая доля работы последовательна, даёт далеко не двукратный выигрыш, а на большом количестве ядер прирост от каждого следующего становится всё меньше. Это не дефект конкретной модели, а свойство самой задачи.

Второй ограничитель — память. Ядра делят общий контроллер и общую пропускную способность. Задача, где каждое ядро постоянно тянет данные из оперативной памяти, упрётся в каналы памяти раньше, чем в вычислительные ресурсы. Поэтому многоядерные конфигурации проектируют вместе с подсистемой памяти, а не отдельно от неё; принципы подбора описаны в разделе про оперативную память.

Как определить свой профиль нагрузки

Практический способ один: посмотреть на загрузку во время реальной работы, а не в синтетическом тесте. Если при полной занятости задачи общая загрузка процессора держится в районе доли, соответствующей одному-двум ядрам, а остальные простаивают, задача однопоточная, и добавление ядер ничего не изменит. Если загружены все ядра равномерно и надолго, профиль параллельный.

Промежуточный случай встречается чаще всего. Игры, например, давно перестали быть однопоточными, но нагрузка в них распределена неравномерно: один поток занят подготовкой команд отрисовки и логикой сцены, остальные обслуживают звук, потоковую подгрузку и физику. Такой поток становится узким местом, и производительность определяется скоростью одного ядра, хотя формально загружены многие. Аналогично ведут себя интерактивные приложения: расчёт может распараллеливаться, но отклик интерфейса зависит от одного потока.

Отдельная категория — приложения, в которых параллельность ограничена лицензией или архитектурой. Старые инженерные пакеты и учётные системы часто считают ядро сверх определённого числа бесполезным, потому что просто не создают дополнительных потоков.

Что это означает при подборе конфигурации

Смысл в том, чтобы не платить ресурсами за то, что не будет использовано. Рабочая станция под сборку проектов, кодирование видео или виртуализацию выигрывает от ядер, и там имеет смысл смотреть в сторону платформ с широким контроллером памяти и большим числом линий, вплоть до серверных процессоров. Машина под интерактивную работу, отклик и однопоточные расчёты выигрывает от высокой частоты и большого кэша.

Есть и энергетическая сторона вопроса. Тепловой и токовый бюджет ограничен, и он делится между ядрами. Чем больше ядер работает одновременно, тем ниже частота каждого — это встроенное поведение любого современного процессора. Многоядерная модель под однопоточной нагрузкой поднимает частоту одного-двух ядер до максимума, но при полной загрузке опускается заметно ниже. Поэтому характеристики вроде максимальной частоты описывают редкий режим, а не постоянный.

Вывод сводится к тому, что вопрос сформулирован неправильно, если задать его абстрактно. Осмысленно он звучит иначе: какая доля моей нагрузки распараллеливается, где находится последовательное узкое место и во что упрётся система раньше — в вычисления, в память или в накопитель. Ответ на это даёт наблюдение за собственными задачами, а не сравнение общих характеристик. Порядок подбора узлов под конкретный профиль работы разобран в разделе сборка.