Что отвечает за изменение нагрузки и частоты ядра в многоядерном процессоре

Посмотрев описание многоядерного дизайна, я продолжаю нахожу несколько диаграмм, но все они выглядят примерно так:

многоядерный дизайн

Я знаю, посмотрев на вывод команды i7z, что разные ядра могут работать на разных частотах.

Это говорит о том, что решения, касающиеся того, какой ядро ​​получит новый процесс и для изменения частоты самого ядра, выполняются либо операционной системой, либо контрольным блоком самого ядра.

Мой вопрос: что контролирует частоты каждого отдельного ядра? Является ли заданием связать процесс READY с конкретным ядром, размещенным в операционной системе, или это делается чем-то внутри процессора.

Ответ 1

Планирование процессов/потоков на ядра чисто до ОС. Аппаратное обеспечение не знает задач, ожидающих запуска. Поддержание списка ОС для процессов, которые выполняются или ожидающих ввода-вывода, является полностью программным обеспечением.

Перенос потока из одного ядра в другой выполняется кодом ядра на исходном ядре, хранящем архитектурное состояние в памяти, затем код ОС на новое восстановление ядра, которое спасло состояние и возобновило выполнение пользовательского пространства.

Традиционно решения о масштабировании частоты и напряжения принимаются ОС. Возьмем Linux в качестве примера: код принятия решения называется governor (а также этот ссылка на вики-ссылку была поднята на google). Он рассматривает такие вещи, как то, как часто процессы использовали весь временной срез для текущего ядра. Если губернатор решает, что процессор должен работать с другой скоростью, он программирует некоторые контрольные регистры для реализации изменения. Насколько я понимаю, аппаратное обеспечение заботится о выборе правильного напряжения для поддержки запрошенной частоты.

Как я понимаю, ОС, работающая на каждом ядре, принимает решения независимо. На оборудовании, которое позволяет каждому ядру работать на разных частотах, код принятия решения не должен координировать друг с другом. Если работа на высокой частоте на одном ядре требует высоковольтного чипа, аппаратное обеспечение позаботится об этом. Я думаю, что современная реализация DVFS (динамическое масштабирование по напряжению и частоте) довольно высокоуровневая, а операционная система просто сообщает аппаратное обеспечение, какое из N вариантов оно хочет, а встроенный микроконтроллер, занимающийся деталями программирования генераторов/делителей часов и регуляторы напряжения.

Функция Intel Turbo, которая оппортунистически повышает частоту выше максимальной устойчивой частоты, принимает решения в аппаратных средствах. Каждый раз, когда ОС запрашивает самую высокую рекламируемую частоту, CPU использует турбонаддув, когда позволяют питание и охлаждение.

Intel Skylake делает следующий шаг: ОС может передать полный контроль над DVFS на оборудование, опционально с ограничениями. Это позволяет реагировать с микросекундной микросекунды, а не на шкалу времени в миллисекундах. Это действительно позволяет повысить производительность при работе с большими нагрузками, поскольку для использования в турбо-режиме может потребоваться больше энергии. Несколько тестов достаточно полны, чтобы наблюдать за этим, как некоторые браузерные/javascript-те IIRC.

Был целый разговор о новом управлении питанием Skylake на IDF2015, проверить слайды и/или архивированную веб-трансляцию. Старый метод подробно описан здесь, чтобы проиллюстрировать разницу, поэтому вы должны действительно проверить, хотите ли вы более подробно, чем мое резюме. (Список других переговоров IDF здесь, благодаря Agner Fog blog для ссылки)

Ответ 2

Частота ядра регулируется заданным напряжением, приложенным к сердечнику "осциллятор".

Это напряжение может быть изменено операционной системой, но оно также может быть изменено самой BIOS, если в CPU обнаружена высокая температура.