В статье рассмотрены основные способы снижения расходуемой мощности и приведены примеры архитектур, в которых эти методы используются. Рассмотрены самосинхронные схемы — как перспективные с точки зрения оптимизации энергопотребления.
Снизить потребляемую устройством мощность можно несколькими способами: путем снижения напряжения питания, уменьшения тактовой частоты, изменения структуры кэша, уменьшения длины межсоединений, а также посредством применения конвейерных механизмов.
Методы оптимизации мощности потребления
Потребляемая энергия E равна мощности потребления P устройства, помноженной на время работы t. Соответственно, чтобы снизить расход энергии, необходимо рассматривать эти два параметра, P и t, в паре, иначе уменьшение одного может произойти за счет увеличения другого, и тогда выигрыша в энергии не будет.
Динамическую мощность потребления процессора можно снизить путем уменьшения тактовой частоты или напряжения питания ЦП. Этот метод получил название “динамическое масштабирование напряжения и частоты” (DVFS — Dynamic voltage and frequency scaling). Напряжение питания и тактовая частота процессора понижаются программным способом так, чтобы ЦП работал на минимальной скорости, достаточной для выполнения приложения или задачи (например, поддержки работы в РВ). При выполнении не требовательных к быстродействию задач работа замедляется.
Чтобы избежать ошибок или задержек, используется планировщик, который определяет, когда каждый запрос приложения (задачи) должен быть выполнен процессором, а в какие промежутки времени можно замедлить работу, чтобы снизить потребление.
Приоритеты задач могут быть расставлены статически (закрепленные приоритеты) или динамически (приоритеты меняются от запроса к запросу). Динамические приоритеты используются, например, в алгоритмах EDF, когда ЦП в первую очередь выполняет задачу, имеющую самый ранний срок исполнения. Статические приоритеты хорошо подходят для периодических задач и равномерного планирования (RMS). Методы динамического масштабирования классифицируются по временным ограничениям (поддерживающие работу в режиме реального времени и нет), степени масштабирования (с приоритетными прерываниями и без них) и политике планирования.
Планирование с приоритетным прерыванием производится следующим образом. Временная шкала делится на интервалы заданной длины. В каждом такте планировщик подбирает оптимальную скорость работы ЦП, учитывая результаты предыдущего такта. Если в предыдущем такте ЦП не успел выполнить задачу, оставшиеся операции переносятся в следующий цикл, а скорость работы увеличивается. При простое (пустых циклах) используется сглаживание. В алгоритмах без вытеснения задачи прогоняются до завершения и не могут быть прерваны во время выполнения. Решения об изменении напряжения питания или скорости работы принимаются только между задачами.
Объем нагрузки задачи определяется как общее количество тактов, требуемое для выполнения всех инструкций задачи. Он зависит от различных динамических параметров, в т.ч. количества циклов останова, вызванных потоком данных или сигналом управления, либо обусловленных неправильным предсказанием ответвления (внутренние инструкции) и количеством циклов останова, произошедших из-за потерь в кэше или буфере быстрого преобразования адреса (внешние инструкции, требующие не только участия процессора, но и доступа к памяти) [2]. Чем больше внешних операций присутствует в алгоритме, тем неэффективнее используются ресурсы процессора, поскольку он вынужден простаивать, пока не закончится обмен с внешней памятью.
При наличии внешних команд перед выполнением очередной инструкции требуется меньше машинного времени, однако планировщик работает по наихудшему сценарию, что приводит к меньшему выигрышу по потребляемой мощности. Выполнение только внутренних команд позволяет максимально сократить расход энергии.
Динамическое масштабирование может использоваться для защиты устройства от несанкционированного доступа, когда по величине тока от источника питания определяется текущая инструкция, выполняемая процессором. Подобные криптографические системы описаны в работе [3].
Стробирование
Динамическая мощность потребления зависит от количества переключений элементов. Соответственно, ее можно уменьшить либо за счет сокращения числа логических элементов (ЛЭ) в схеме, либо за счет уменьшения тактовой частоты. При этом скорость вычислений возрастает, что также сокращает расход энергии.
Обычно на схему тактирования приходится 20—40% общего потребления. Для отключения неиспользуемых элементов применяется стробирование (см. рис. 1). Алгоритмы стробирования делятся на три группы: системные, последовательные и комбинационные. Системное стробирование блокирует тактирование для всего блока и отключает его. Остальные два вида останавливают сигнал синхронизации только для некоторых частей блока. Сам блок продолжает работать.
![]() |
Рис. 1. Стробирование логического элемента |
Выявление неиспользуемых элементов и отключение их во время работы программы поsзволяет сэкономить 15—64% мощности потребления без существенного увеличения задержек или занимаемой площади на кристалле.
Стробирование питания
Это один из самых эффективных методов одновременного снижения и подпороговой утечки, и утечки через затвор, поскольку питание элемента блокируется полностью. Выигрыш по динамической мощности происходит за счет использования элементов с низким пороговым напряжением. При этом статическая мощность потребления может увеличиться.
Упрощенная схема логического блока (ЛБ) со стробированием по питанию показана на рисунке 2. Ключ может располагаться как до логической схемы, так и после нее. Когда блок неактивен, сигнал подтверждения состояния Sleep размыкает один из ключей, на порядки снизив утечку. Этот метод широко используется в процессорах для реализации спящего режима.
| Рис. 2. Упрощенная схема ЛБ со стробированием по питанию |
![]() |
Методы уменьшения мощности на компонентном уровне
Перейдем к рассмотрению наиболее энергопотребляющих частей устройства и методов снижения расходуемой ими мощности.
Кэш
Основной вклад в рассеиваемую мощность со стороны кэш-памяти вносят массивы данных и тегов, поскольку чаще всего они хранятся в статических ОЗУ, чтобы скорость доступа к кэшу совпадала со скоростью тактирования конвейера. Свой вклад вносит и частота доступа.
Накристальные модули кэша рассеивают 25—50% мощности в различных процессорах. Эту величину можно уменьшить несколькими способами: усовершенствованием технологического процесса, изменением структуры ячейки памяти, уменьшением напряжения, оптимизацией структуры кэша. Кроме того, можно принять дополнительные меры, такие как разделение кэша, добавление промежуточных буферов, отключение строк и оптимизация алгоритмов сравнения тегов.
Добавление буферов
Самый распространенный подход к снижению энергопотребления кэш-памяти — это добавление небольшого кэша или буфера, чтобы брать данные из него напрямую (см. рис. 3) без обращения к общему кэшу. Поскольку этот буфер относительно мал, то расход энергии существенно сокращается при условии, что обеспечивается достаточная частота попаданий.
| Рис. 3. Структура модуля памяти |
![]() |
Аналогичное назначение имеет фильтр кэша (кэш нулевого уровня), который располагается между ЦП и кэшем инструкций и обслуживает поток инструкций. Согласно измерениям, до 40% мощности расходуется на выборку и декодирование команды. Использование фильтра позволяет сократить расход почти вдвое.
Фильтр кэша может быть дополнительно оптимизирован, если реализовать схему динамического предсказания адреса следующей выборки. Это позволит заранее определить, находится ли нужный адрес в фильтре кэша. Если адреса нет, то процессор обращается сразу в кэш инструкций, экономя, по крайней мере, один машинный цикл.
Отключение строк кэш-памяти
В определенные промежутки времени активность кэш-памяти концентрируется на небольшом наборе строк. Остальные ячейки можно перевести в спящее состояние, чтобы уменьшить утечку. Методы выделения неиспользуемых уровней подробно изложены в работе [4].
Одна из методик основана на временном факторе (cache decay). Если к строке не происходит обращений в течение заданного количества тактов, она отключается. Как показывают исследования, данный подход позволяет уменьшить рассеяние на 70% в кэше первого уровня (L1). Еще большего выигрыша можно добиться, если изменять допустимое время простоя по ходу программы. Другой подход — отключать строки сразу после последнего обращения к ним. Однако вычислить, какое из обращений последнее, сложнее, чем предсказать промах в следующем цикле. Выделяют три способа распознавания последнего обращения: с помощью компилятора, с помощью схем предсказания и методом профилирования. Компилятор анализирует загрузку кэша и отключает строки, когда они больше не используются. Профилирование позволяет идентифицировать инструкции, которые осуществляют последнее обращение к данным. После этого считывания данные вытесняются новыми.
Для уменьшения утечки в кэше второго уровня (L2) применяется похожая методика. Решение о вероятности обращения к строке выносится индивидуально на основе статистики ее использования. Если время простоя превышает время между двумя успешными обращениями, строка отключается.
Разделение кэша
Разделения памяти на небольшие блоки позволяет уменьшить длину адреса и снизить потребление, в т.ч. за счет отключения неиспользуемых ячеек. Один вид разделения — добавление буфера — мы уже рассмотрели. Другой подход предложен в работе [5]. Модуль кэша разделяется на маленькие блоки, каждый из которых представляет собой автономный кэш. При таком подходе не только уменьшается расход энергии на обращение, но и локализуется работа.
Как видно из рисунка 4, кэш состоит из трех блоков. Буфер быстрого преобразования адреса (TLB — translation lookaside buffer) содержит таблицу перевода виртуальных адресов в физические. Подкэш, к которому обращаются все строки кэша со страницы, прописывается в поле subcache id. Адрес подкэша требуется, когда алгоритм предсказания дает сбой.
| Рис. 4. Структура кэша с разделением на подкэши |
![]() |
Следующий блок — предсказатель. Он содержит регистр, в котором хранится указатель на подкэш инструкций, обращение к которому было последним (MRU — most recently used). Сначала процессор считывает данные из MRU. Если нужных данных там нет, то загружается указатель subcache id, чтобы проверить предсказание. Если предсказание верно, то промах был произведен в кэше инструкций. Если ложно, то производится обращение к нужному подкэшу. При этом потери возрастают на время доступа к кэшу. Если происходит промах даже при обращении в нужный подкэш, то значит данные были потеряны физически.
Третий блок отвечает за размещение страниц и перераспределение памяти. Данные в подкэше располагаются по страницам. Всем строкам страницы ставится в соответствие определенный подкэш, обращение к которому осуществляется напрямую (ПДП). Если количество промахов при обращении к подкэшу в рамках заданного временного интервала превышает некоторое значение, то страница переназначается другому сегменту кэша, в котором наблюдается минимальное количество промахов. Для этого у каждого подкэша есть собственный счетчик промахов. Для определения момента, когда нужно произвести переназначение, используется глобальный счетчик промахов динамического перераспределения.
В сочетании с разделением кэш-памяти на области или отдельные подкэши можно применять коды Грея для адресов. Отличительным свойством этих кодов является то, что при переходе к соседнему значению всегда меняется только один бит. Таким образом, при последовательном считывании данных из ячеек количество изменяемых битов будет минимально, а, следовательно, сократится и расход энергии на переключение.
Метки и степень ассоциативности
На считывание и сравнение меток тратится достаточно много энергии. Это особенно важно для кэш-памяти с высокой степенью ассоциативности, поскольку одновременно производится большое количество сравнений. Для сокращения сравнений применяются таблицы TCE (Tag comparison elimination). Сравнение считается лишним, если его результат может быть определен иначе или известен заранее. Например, компилятор отбрасывает сравнение тегов внутри строки. Другой способ — отмечать те ветви, в которых выборка инструкций производится из различных блоков кэша. Еще один подход предполагает введение S-кэша, в котором хранятся все наиболее часто выполняемые блоки кода. Они загружаются до начала работы программы [6].
В полностью ассоциативной (fully associative) кэш-памяти информация, находящаяся по некоторому адресу в оперативной памяти, может быть записана в произвольную строку. В случае кэш-памяти с прямым отображением (direct mapped) эта же информация может быть размещена только в одной из всех имеющихся строк кэш-памяти. Таким образом, в полностью ассоциативной модели каждая строка выступает в качестве самостоятельного сегмента, а в модели с прямым отображением имеется только один сегмент на все строки. Модель с прямым отображением является наиболее быстрой в работе, т.к. процессор не производит выбор строки. С другой стороны, по этой же причине данная модель является наименее эффективной при записи данных.
Полностью ассоциативная модель, наоборот, является наиболее эффективной в работе, но в то же время и самой медленной. Соответственно, в каждом конкретном случае необходимо искать компромисс между быстродействием и эффективностью. Обычно степень ассоциативности составляет 2—4 канала.
Принципиально другой метод описан в работе [7]. Массив меток содержит как виртуальные, так и физические теги. Физические теги используются для обращения к общим областям данных, чтобы избежать несоответствия содержимого различных модулей кэша. Таким образом, отпадает необходимость транслирования большого количества адресов, что, в свою очередь, позволяет сократить потребляемую мощность.
Конвейер
Один из хороших способов уменьшить количество лишних переключений — это контролировать алгоритмы предсказания. Одним из самых распространенных таких алгоритмов является конвейерная обработка данных, когда инструкции начинают выполняться еще до того, как станет точно известно, что это понадобится. Во многих случаях этот метод позволяет существенно повысить производительность, однако если в программе есть ответвления, то ресурсы процессора тратятся впустую, выполняя ненужные операции.
Конвейер состоит из ступеней, осуществляющих обработку данных. Каждая ступень содержит некоторое число регистров, количество которых зависит от расположения ступени. Чем меньше регистров, тем меньше мощность потребления.
Потребление регистров можно уменьшить за счет слияния ступеней конвейера (PSU — pipeline stage unification). Тактовая частота работы регистра динамически регулируется, чтобы потребление было минимальным. Однако в отличие от DVFS это происходит не за счет снижения напряжения питания, а за счет обхода некоторых регистров. При этом не только снижается нагрузка на схему тактирования, но и уменьшается количество ступеней и, следовательно, время выполнения команды.
Другой способ оптимизации потребления — разделение схемы на две части. По структуре конвейер представляет собой комбинационные логические блоки (КЛБ), разделенные регистрами. Чтобы уменьшить число выходных сигналов и количество переключений регистров и ЛБ, схема разделяется на две части и кодируется, используя функции расширения Шеннона.
Для реализации параллельной выборки инструкций необходимы алгоритмы предсказания ветвей и методы оценки их достоверности. На аппаратном уровне применяется стробирование конвейера, которое позволяет избежать бесполезной траты энергии, если предсказания ошибочны. Для этого в схему вводятся оценщики достоверности, которые следят за работой предсказателей ветвей и оценивают их надежность. Если прогнозы оказываются ошибочными, предсказатель относится к классу недостоверных, в противном случае он считается надежным. По этим оценкам выявляются инструкции, выполнение которых не потребуется. Соответствующие ступени конвейера останавливаются.
Шины
По мере уменьшения размеров элементов все большее значение приобретает энергопотребление соединительных проводников и задержки, вносимые ими. Наиболее остро эта проблема проявляется в шинных соединениях, поскольку они могут рассеивать до трети всей потребляемой мощности.
Существует несколько подходов к оптимизации энергопотребления шины. Остановимся на следующих: уменьшение размаха сигнала, применение кодов, обеспечивающих минимальное количество переключений и локализация связей.
Для уменьшения размаха сигнала следует использовать преобразователь уровней, который уменьшает амплитуду входного сигнала (с передатчика), а затем производит обратное действие в приемнике (см. рис. 5).
| Рис. 5. Уменьшение размаха сигнала на шине |
![]() |
Как известно, чем длиннее проводник, тем больше его паразитная емкость. Соответственно, поскольку длину связей не всегда можно уменьшить, нужно сократить число переключений на таких участках с помощью кодирования сигнала. Среди самых распространенных — коды Хемминга и Грея. Кроме того, хороших результатов (до 60% снижения мощности) можно достичь с помощью кодов T0 [8]. Данная схема предполагает, что адреса идут последовательно, если не встречается команда или исключение. Если адреса идут последовательно, то передатчик “замораживает” значение на шине и переключается на дополнительную линию (INC). В противном случае линия INC отключается, и посылается исходный адрес. При передаче данных из соседних ячеек это наиболее эффективный метод кодирования.
Другой подход — разделение самой шины на сегменты (см. рис. 6). Энергия потребляется только активными участками шины. Кроме того, за счет уменьшения длины связи ослабляются паразитные эффекты, что также позволяет уменьшить расход.
| Рис. 6. Разделение шины на два сегмента |
![]() |
Самосинхронные процессоры
Самосинхронные схемы являются одними из самых “продвинутых” в смысле управления мощностью. Благодаря отсутствию схемы тактирования, одного из главных источников рассеяния, удается существенно сократить энергопотребление. Кроме того, снимается вопрос расфазировки тактовых импульсов и уменьшаются шумы. Самосинхронные схемы имеют модульную структуру, что позволяет использовать их в различных проектах. С другой стороны, поскольку нет синхронизирующих сигналов, необходимо аккуратно спроектировать протоколы установления связи, иначе могут появиться паразитные импульсы и гонки. Самосинхронные схемы занимают больше площади, чем синхронные, поэтому они дороже.
Один из первых примеров самосинхронного процессора — AMULET. Это первая разработка ARM в данной области (1993 г.). Процессор состоит из нескольких функциональных блоков, работающих независимо и параллельно и обменивающихся данными через протоколы установления связи. По этой же схеме работают и другие процессоры, например SNAP, ARM996HS, HT80C51, SUN sproull.
Самосинхронные схемы имеют несомненные преимущества, но отсутствие коммерческого набора инструментов и средств разработки остановило их распространение. До сих пор полноценной среды не предложено. Есть наработки — TiDE и BALSA, но они не решают всех проблем, и рынок продолжает ждать.
Другой подход — GALS (globally asynchronous and locally synchronous) — асинхронные схемы с локальной синхронизацией. Он сочетает в себе достоинства как асинхронных, так и синхронных схем, исключая их недостатки. Устройства GALS делятся на три типа: тактовые генераторы с возможностью остановки (рausible-clock), буферы FIFO и схемы граничной синхронизации.
Генераторы с возможностью остановки представляют собой несколько отдельных локальных тактовых генераторов, управляемых информационным сигналом. Их работа приостанавливается, чтобы избежать метастабильности либо остановить передатчик или приемник, если канал пуст или полон. Использование буферов FIFO между блоками с местным тактированием позволяет справиться с проблемой синхронизации и применяется в схемах NoC (сеть на кристалле). Схемы граничной синхронизации ставятся на границах областей с локальным тактированием, чтобы сигналы, передаваемые из одной области в другую, не задерживались и сохраняли синхронизацию.
Технологии GALS применяются уже более 20 лет, но получили малое распространение в коммерческих проектах. Возможно, это связано с недостаточной системной интеграцией и высоким уровнем ЭМИ. Кроме того, они занимают больше места на кристалле, что иногда приводит к ухудшению характеристик.
Рассмотрим несколько архитектур самосинхронных процессоров.
RISP-процессоры с реконфигурируемым набором инструкций
Идея конфигурируемых вычислений относится к 1960 г., когда впервые была представлена машина с частично изменяемой структурой (см. рис. 7а). Процессоры RISP значительно отличаются от классических. Они состоят из неизменяемых простых функциональных блоков и конфигурируемой логики (см. рис. 7б), что позволяет программным способом настраивать тракт данных. В процессорах RISP заложена задача сокращения разовых расходов на проектирование и внедрение в производство специализированных IP и в то же время обеспечения гибкости на том же уровне, что у заказных прикладных схем. Таким образом, процессоры экономичны по потреблению и имеют высокое быстродействие. В зависимости от размера КЛБ, RISP-процессоры делятся на мелко- и крупноструктурные. Первые имеют большую гибкость, обрабатывая данные поразрядно. Однако это усложняет алгоритмы обработки и может сказаться на увеличении мощности потребления и занимаемой площади на кристалле и привести к увеличению задержки из-за большего количества межсоединений. Крупноструктурные RISP не так гибки, поскольку состоят из КЛБ большего размера, и могут обрабатывать несколько разрядов одновременно.
| Рис. 7. Архитектуры RISP: первая разработка (а) и современный вариант (б) |
![]() |
Отдельно выносят процессоры Warp. В них используется динамическая программная оптимизация для повышения отношения “скорость/энергия”. При первом прогоне программы на неизменяемой части процессора система проводит мониторинг, выделяя наиболее часто выполняемые сегменты программы. Затем процессор автоматически пытается перенести эти части на конфигурируемую логическую схему или FPGA, не прерывая хода программы. Такой способ конфигурации более эффективен и прост, чем классическая компиляция. Процессоры Warp способны ускорить вычисления в 6 раз, снижая энергопотребление на 60%. Единственная разница между RISP и Warp заключается в том, что в последних конфигурируемая часть размещена на отдельном кристалле, отдельной FPGA для Warp (W-FPGA).
Другой пример RISP-процессора — RICA. Архитектура RICA состоит из набора динамически конфигурируемых командных ячеек (instruction cell), программируемых на языках высокого уровня. Это достигается за счет инновационного дизайна кристалла — с одной стороны, он состоит из конфигурируемых массивов, но они настраиваются программно. В итоге RICA отличается высоким быстродействием, как крупноструктурные FPGA, и в то же время высокой гибкостью и низкой стоимостью, как процессоры общего назначения.
ASIP-процессоры со специализированным набором команд
Процессоры ASIP — нечто среднее между процессорами общего назначения и специализированными СБИС. Они имеют набор встроенных операций и профайлер кода для представления любой инструкции приложения в базисе встроенных операций. Построение оптимального набора расширенных инструкций — это главная задача разработчика, от решения которой зависят характеристики работы процессора. Для больших приложений этот набор сложно создать вручную, поскольку накладывается слишком много ограничений, таких как жесткий формат инструкции, период тактового сигнала, свободная площадь на кристалле и т.д.
Среди удачных коммерческих процессоров ASIP можно отметить Extensa Processors (Tensilica), Improv Systems Jazz DSP, NIOS (Altera) и Microblaze (Xilinx).
NISC-процессоры без набора инструкций
Совершенно иной подход реализован в процессорах, не имеющих набора инструкций. Тракт данных создается под конкретное приложение, а код компилируется не в инструкции, а в контрольные слова [9]. На рисунке 8 видны различия между архитектурами RISC и NISC.
| Рис. 8. Архитектуры RISC и NISC |
![]() |
Заключение
Мы рассмотрели основные методы оптимизации потребляемой устройством мощности. Некоторые из них могут использоваться одновременно, позволяя увеличить выигрыш. В системах с планированием задач применяется динамическое уменьшение тактовой частоты и напряжения питания. Модули кэш наиболее эффективно используются в тех приложениях, в которых процессор часто обращается к внешней памяти. Обращения к кэш-памяти производятся быстрее, чем к внешней, поэтому мощность потребления снижается.
Эффективность работы кэша повышается путем дополнительных приемов, таких как отключение строк или разделение на уровни или независимые подкэши. Для повышения производительности процессора успешно применяется конвейерная обработка данных. Применение рассмотренных алгоритмов предсказания позволяет оптимизировать параллельную обработку данных и свести к минимуму лишние операции.
Литература
1. Qadri M. и др. “Low Power Processor Architectures and Contemporary Techniques for Power Optimization — A Review”//Journal of computers, том 4, №10, октябрь 2009.
2. Choi K. и др. “Dynamic voltage and frequency scaling under a precise energy model considering variable and fixed components of the system power dissipation”//Proceedings of the 2004 IEEE/ACM Internationalconference on Computer-aided design: IEEE Computer Society, 2004.
3. Yang S. и др. “Power Attack Resistant Cryptosystem Design: A Dynamic Voltage and Frequency Switching Approach”//Proceedings of the conference on Design, Automation and Test in Europe — том 3: IEEE Computer Society, 2005.
4. Kaxiras S. и др. “Cache decay: exploiting generational behavior to reduce cache leakage power”//Proceedings of the 28th annual international symposium on Computer architecture, Sweden: ACM, 2001.
5. Kim S. и др. “Partitioned instruction cache architecture for energy efficiency”// Trans. on Embedded Computing Sys., том 2, стр. 163–185, 2003.
6. Zhang Y. и Yang J. “Low cost instruction cache designs for tag comparison elimination”//Proceedings of the 2003 international symposium on Low power electronics and design Сеул, Корея: ACM, 2003.
7. Zhou X. и Petrov P. “Low-power cache organization through selective tag translation for embedded processors with virtual memory support”//Proceedings of the 16th ACM Great Lakes symposium on VLSI Филадельфия, США: ACM, 2006.
8. Benini L. и др. “Asymptotic Zero-Transition Activity Encoding for Address Busses in Low-Power Microprocessor-Based Systems”//Proceedings of the 7th Great Lakes Symposium on VLSI: IEEE Computer Society, 1997.
9. Reshadi М. и Gajski D. “А cycle-accurate compilation algorithm for custom pipelined datapaths”//Proceedings of the 3rd IEEE/ACM/IFIP international conference on Hardware/software codesign and system synthesis Нью-Джерси, США: ACM, 2005.
10. http://docstore.mik.ua/svk/contents.htm.









