Гибридная компоновка означает, что на одном кристалле соседствуют ядра двух разных микроархитектур. Крупные рассчитаны на скорость одного потока: широкий внеочередной конвейер, объёмные кэши, агрессивное предсказание переходов, высокие частоты. Компактные оптимизированы по площади и потреблению: конвейер уже, частотный потолок ниже, но на квадратный миллиметр кристалла и на каждый ватт они дают больше суммарной пропускной способности. Набор команд у обоих типов общий, поэтому для приложения это по-прежнему один процессор — просто с ядрами, которые различаются по скорости в разы.
Почему однородная схема упёрлась в стену
Прирост скорости одного потока стоит дорого. Чтобы поднять её ещё немного, приходится расширять декодер, увеличивать окно переупорядочивания команд, наращивать кэш. Площадь при этом растёт быстрее отдачи, а потребление растёт ещё быстрее, потому что вслед за частотой нужно поднимать и напряжение, а мощность зависит от напряжения квадратично. Размножить такие ядра на полтора десятка невозможно: ни тепловой пакет, ни площадь кристалла не резиновые.
При этом значительная часть работы в системе к задержке одного потока нечувствительна. Индексация файлов, распаковка архива, обслуживание служб, фоновая синхронизация, кодирование потока — этим задачам нужна суммарная пропускная способность, а не рекордная частота. Отсюда и разделение: несколько крупных ядер держат отзывчивость, группа компактных забирает массовую работу.
Кто решает, на какое ядро попадёт поток
Распределением занимается планировщик операционной системы, но вслепую он справляется плохо. Поэтому процессор передаёт наверх телеметрию: какой класс инструкций преобладает в потоке, насколько тот упирается в память, сколько времени проводит в ожидании. Планировщик комбинирует эти подсказки с собственными признаками — приоритет процесса, находится ли окно на переднем плане, помечен ли поток как фоновый, сколько он уже отработал без вытеснения.
Дальше поток может мигрировать. Заснувший на компактном ядре и внезапно ставший активным переезжает на производительное, долго молотящий фоновую работу — в обратную сторону. Решение принимается постоянно и с задержкой: между моментом, когда нагрузка изменила характер, и моментом переезда проходит время, заметное для интерактивных задач. Отсюда неровное поведение гибридных систем на коротких всплесках активности.
Что схема даёт и чего не даёт
Даёт она три вещи. Первая — потребление в простое и при лёгкой нагрузке: крупные ядра стоят с погашенными блоками, весь фон обслуживает пара компактных, и разница в ваттах ощутима. Вторая — суммарная пропускная способность в задачах, которые нормально делятся на потоки: сборка проекта, рендер, перекодирование. Третья — отзывчивость: фоновые процессы уезжают с производительных ядер, и активное приложение реже спотыкается о чужую работу.
Не даёт роста там, где всё упирается в один поток. Однопоточной задаче компактные ядра бесполезны, они лишь освобождают крупное ядро от помех. Не даёт и предсказуемости в задачах с жёсткими требованиями к задержке: аудиопоток или расчёт кадра, случайно оказавшийся на медленном ядре, даёт видимый провал, который не лечится увеличением общего числа ядер.
Типичные сбои распределения
Первый класс проблем — операционная система, которая не умеет отличать типы ядер. Она распределяет потоки как по однородному процессору, и тяжёлая работа регулярно оказывается на компактных ядрах. Внешне это выглядит как случайные просадки при неизменной нагрузке.
Второй класс — программы, которые сами задают привязку к ядрам или считают количество ядер, чтобы выбрать число рабочих потоков. Такой код видит разнородный набор, делит работу поровну, после чего быстрые ядра простаивают в ожидании медленных, и общее время определяется самым медленным куском. Классический признак — многопоточная задача, которая от добавления потоков перестаёт ускоряться раньше, чем ожидалось.
Третий класс — низкоуровневые драйверы и защитные модули, для которых миграция потока между ядрами с разными характеристиками выглядит аномалией. Четвёртый — расхождение по поддерживаемым расширениям набора команд: если у двух типов ядер списки расширений не совпадают полностью, лишнее отключают на уровне всего процессора, иначе поток упадёт при переезде на ядро, которое такую инструкцию не знает.
Отдельная история — измерения. Замер, сделанный без контроля того, на каких ядрах шла работа, на гибридной системе плохо воспроизводится: два запуска одной и той же задачи расходятся просто потому, что планировщик распорядился по-разному.
Что это меняет при сборке
Гибридный процессор не снижает требований к питанию и охлаждению. Наоборот: в многопоточной нагрузке он способен занять все ядра сразу, и кратковременное потребление оказывается заметно выше числа из паспорта. Радиатор и цепи питания платы подбираются под пиковый режим, а не под усреднённый — сопоставление узлов между собой удобно вести по общему порядку подбора.
Второе — версия прошивки платы. Таблицы, по которым система понимает состав и характеристики ядер, приходят из прошивки; на устаревшей версии распределение потоков деградирует до однородного, и часть выигрыша теряется независимо от того, насколько удачен сам кристалл. Третье — версия операционной системы, поскольку без штатной поддержки разнородных ядер планировщик работает по старым правилам. Особенности отдельных семейств и то, как в них разделены типы ядер, разобраны в разделе процессоры.