Кто-нибудь знает какой-либо компилятор, который оптимизирует код для потребления энергии для встроенных устройств? - PullRequest
18 голосов
/ 20 января 2011

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

Предположим, есть последовательность командкоторый выполняется за 1 мс, а в процессе выполнения среднее потребление тока, скажем, 40 мА..и ваш Vdd равен 3,3 В

, поэтому полная потребляемая энергия = V * I * t = 3,3 * 40 * 10 ^ -3 * 1 * 10 ^ -3 Джоулей = 13,2 * 10 ^ -6 Джоулей

и в другом случае есть последовательность команд, которая выполняется за 2 мс, а в процессе выполнения среднее потребление тока составляет 15 мА..и Vdd составляет 3,3 В

, поэтому общее энергопотребление = V * I * t = 3,3 * 15 * 10 ^ -3 * 2 * 10 ^ -3 Джоулей = 9,9 * 10 ^ -6 Джоулей

так что вопрос возникает....Существует ли какая-либо архитектура, которая имеет разные наборы команд для выполнения одной и той же задачи с разными потребностями тока?

И если есть ... то есть ли компилятор, который учитывает это и генерирует код, который является энергоэффективным

Ответы [ 4 ]

4 голосов
/ 20 января 2011

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

Редактировать: Говорили о Аналитика энергопотребления в LLVM в FOSDEM.

1 голос
/ 17 августа 2014

Практически любая «оптимизация кода», выполняемая компилятором, который вычисляет ответ быстрее, чем неоптимизированный код, является «энергосберегающей».(Как заметил другой автор, избежать промахов в кэше - большая победа).Таким образом, реальный вопрос заключается в том, «какие оптимизации явно предназначены для экономии энергии по сравнению с сокращением времени выполнения?»(Примечание: некоторые «оптимизации» уменьшают размер занимаемого кода (путем абстрагирования последовательностей кода в подпрограммы и т. Д.; Это может на самом деле стоить больше энергии).

Необычная, которую я не видел ни в одном компиляторе, меняется представление данных.Оказывается, что стоимость хранения / передачи нулевого бита отличается от стоимости хранения одного бита.(Мой опыт работы с TTL и CMOS «ноль» более дорогой, потому что они реализованы в виде аппаратного обеспечения как своего рода «активное понижение напряжения» через резистор от источника питания, в результате чего поток тока, таким образом, нагревается, тогда как «единицы»реализуется, позволяя сигналу «плавать высоко» через одно и то же опускание).Если имеется смещение, то следует реализовать программный код и данные, чтобы максимизировать количество однобитных, а не нулевых бит.

Для данных это должно быть относительно просто сделать.См. этот документ для очень хорошего обзора и анализа ценности, найденной в памяти;он содержит несколько замечательных диаграмм.Общая тема: Большое количество областей памяти занято членами небольшого набора различных значений. Фактически, только очень небольшое количество значений (до 8) занимает до 48% ячеек памяти , часто представляющих собой очень малые числа (в некоторых программах показано, что значительная доля передачи данных предназначена для небольших значений, например, от 0 до 4, причем ноль является, по существу, наиболее распространенным значением). Если нули действительно дороже хранить / передавать, чем единичные, небольшие общие значения предлагают хранить значения в их формате, дополняющем их .Это довольно простая оптимизация для реализации.Учитывая, что значения не всегда являются наименьшими натуральными значениями N, можно заменить N-е наиболее частое значение в памяти на N и сохранить дополнение N, выполнив поиск фактического значения ближе к процессору.(Автор статьи предлагает аппаратный кэш «повторного использования значений», но это не оптимизация компилятора.)

Это немного сложно организовать для программного кода, поскольку набор команд определяет, что вы можете сказать, и обычнонабор команд был разработан независимо от каких-либо измерений энергии.Тем не менее, можно выбирать разные последовательности команд (это то, что делают оптимизаторы) и максимизировать их на один бит в потоке команд.Я сомневаюсь, что это очень эффективно для обычных кодов набора команд.Когда-то, конечно, можно было бы поместить переменные в местоположения, адрес которых имеет большое число, равное одному биту, и предпочитать использовать регистры с более высокими числами, а не с более низкими (на x86 EAX - это двоичный регистр-номер 000, а EDI - регистр № 111)настолько, чтобы спроектировать набор команд в соответствии с частотами выполнения команд, назначая код операции с большими числами в один бит для часто выполняемых команд.

0 голосов
/ 17 августа 2014

Попробуйте " MAGEEC ".У меня нет личного опыта работы с компилятором.Но в описании на сайте говорится, что можно генерировать энергоэффективный код.

0 голосов
/ 20 января 2011

На уровне отдельных команд такие вещи, как смещение, а не умножение, безусловно, понизят ток и, следовательно, потребляют энергию, но я не уверен, что куплю ваш пример взятия в два раза дольше, но с использованием половины тока (для заданной тактовой частоты) , Действительно ли замена умножения на сдвиг и сложение, которое удваивает время, действительно занимает половину тока? В процессоре происходит столько всего другого (только распределение тактовых импульсов по чипу требует тока), что я думаю, что фоновое текущее использование доминирует.

Снижение тактовой частоты, вероятно, самая большая вещь, которую вы можете сделать, чтобы сократить энергопотребление. И делать как можно больше параллельно - это самый простой способ понизить тактовую частоту. Например, использование прямого доступа к памяти по явным прерываниям позволяет завершать алгоритмическую обработку за меньшее количество циклов. Если у вашего ЦП странные режимы адресации или параллельные инструкции (я смотрю на вас, TMS320), я был бы удивлен, если бы вы не смогли вдвое сократить время выполнения коротких циклов, если вдвое меньше тока, что дает чистую экономию энергии. А в процессорах семейства Blackfin снижение тактовой частоты позволяет снизить напряжение ядра, значительно снижая энергопотребление. Я полагаю, что это верно и для других встроенных процессоров.

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

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

...