Планирование процессов/нитей на сердечники чисто up to the OS. Аппаратное обеспечение не знает задач, ожидающих запуска. Поддержание списка ОС, которые выполняются в сравнении с ожиданием ввода-вывода, полностью является программным обеспечением.
Перенос нити из одного ядра в другой осуществляется с помощью кода ядра на исходном ядре, хранящего architectural state, а затем код ОС нового ядра, восстанавливающий это состояние и возобновление выполнения пользовательского пространства.
Традиционно решения масштабирования частоты и напряжения выполняются ОС. Возьмем Linux в качестве примера: код принятия решения называется governor (а также этот arch wiki link came up high on google). Он смотрит на такие вещи, как часто процессы использовали весь их time slice на текущем ядре. Если губернатор решает, что процессор должен работать с другой скоростью, он программирует некоторые контрольные регистры для реализации изменения. Насколько я понимаю, оборудование заботится о выборе right voltage to support the requested frequency.
Как я понимаю, ОС, работающая на каждом ядре, принимает решения самостоятельно. На оборудовании, которое позволяет каждому ядру работать на разных частотах, код принятия решения не должен координировать друг с другом. Если работа на высокой частоте на одном ядре требует высоковольтного чипа, аппаратное обеспечение позаботится об этом. Я думаю, что современная реализация DVFS (динамическое масштабирование по напряжению и частоте) довольно высокоуровневая, а операционная система просто сообщает аппаратное обеспечение, какое из N вариантов оно хочет, а встроенный микроконтроллер, занимающийся деталями программирования генераторов/делителей часов и регуляторы напряжения.
Функция «Turbo» от Intel, которая оппортунистически повышает частоту выше максимальной устойчивой частоты, принимает решения в аппаратных средствах. Каждый раз, когда ОС запрашивает самую высокую рекламируемую частоту, CPU использует турбонаддув, когда позволяют питание и охлаждение.
Intel Skylake делает следующий шаг: ОС может передать полный контроль над DVFS на оборудование, опционально с ограничениями. Это позволяет реагировать с микросекундной микросекунды, а не на шкалу времени в миллисекундах. Это фактически позволяет повысить производительность при работе с большими нагрузками, поскольку для использования в турбо-режиме может потребоваться больше бюджета мощности. Несколько тестов достаточно полны, чтобы наблюдать это, как некоторые браузерные/javascript.
Был целый разговор о новом управлении мощностью Skylake в IDF2015, check out the slides and/or archived webcast. Старый метод подробно описан здесь, чтобы проиллюстрировать разницу, поэтому вы должны действительно проверить, хотите ли вы более подробно, чем мое резюме. (Список других переговоров IDF: here, спасибо Agner Fog's blog за ссылку)
@xmojmr Я пробовал несколько PDF-файлов из предоставленной вами ссылки. Они все, что показано на рисунке 3-9, но не тот, который вы описали. Не могли бы вы рассказать мне, что вы имеете в виду? – v010dya
open http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf (_Combined Volumes: 1 , 2A, 2B, 2C, 3A, 3B и 3C_), ctrl + F "_Algorithm for Extracting Processor Frequency_" – xmojmr
@xmojmr Все модели, обсуждаемые там (как показано в таблице ниже этой диаграммы), относятся к одноядерным процессорам , Так что это действительно не помогает. – v010dya