Энергоэффективное кодирование программного обеспечения

В типичном портативном / портативном устройстве со встроенной системой Срок службы батареи является серьезной проблемой при разработке аппаратного и программного обеспечения, а также функций, которые устройство может поддерживать. С точки зрения программирования, каждый знаком с кодом, оптимизированным для MIPS, памяти (данных и программ). Мне известны H / W режим глубокого сна, режим ожидания, которые используются для синхронизации оборудования при более низких циклах или для полного переключения часов на некоторые неиспользуемые схемы для экономии энергии, но я ищу некоторые идеи с этой точки зрения :

Где мой код работает, и он должен продолжать выполняться, учитывая это, как я могу написать код "power" эффективно, чтобы потреблять минимум ватт?

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

Есть ли какие-либо соображения по проектированию высокоуровневого ПО, которые следует учитывать при проектировании структуры кода или при проектировании нижнего уровня, чтобы сделать код максимально энергоэффективным (с наименьшим энергопотреблением)?


person goldenmean    schedule 15.09.2008    source источник
comment
Согласен, мне это бесполезно, но тем не менее это действительно хороший вопрос :)   -  person Teifion    schedule 15.09.2008
comment
Зачем беспокоиться :-) Судя по тому, что я вижу, большинство приложений на портативных устройствах больше не обращают внимания на время автономной работы :-( К счастью, операционные системы все еще делают это.   -  person itj    schedule 15.09.2008


Ответы (17)


  • Как сказал 1800 INFORMATION, избегайте опросов; подписывайтесь на события и ждите, пока они произойдут
  • Обновлять содержимое окна только при необходимости - пусть система решит, когда его перерисовывать
  • При обновлении содержимого окна убедитесь, что ваш код воссоздает как можно меньше недопустимой области.
  • С быстрым кодом ЦП быстрее возвращается в режим глубокого сна, и есть больше шансов, что такой код останется в кеше L1.
  • Работайте с небольшими данными одновременно, поэтому данные также остаются в кешах
  • Убедитесь, что ваше приложение не выполняет никаких ненужных действий в фоновом режиме.
  • Сделайте свое программное обеспечение не только энергоэффективным, но и осведомленным о потреблении энергии - реже обновляйте графику при работе от батареи, отключите анимацию, уменьшите нагрузку на жесткий диск

И прочтите некоторые другие рекомендации. ;)

Недавно появилась серия сообщений под названием " Оптимизация программных приложений для энергии ", начало появляться в блогах Intel Software Blogs. Может быть полезно для разработчиков x86.

person macbirdie    schedule 15.09.2008

Zeroith, используйте полностью статичную машину, которая может останавливаться на холостом ходу. Ноль Гц не побить.

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

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

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

Не доверяйте фреймворкам GUI, которые вы не проверяли на наличие кода типа "спящий и вращающийся". В особенности таймер событий, который вы можете использовать для №2.

Блокировать поток при чтении вместо опроса с помощью select () / epoll () / WaitForMultipleObjects (). Вызывает нагрузку на планировщик потоков (и ваш мозг), но устройства в целом работают нормально. Это приводит к небольшому изменению вашего высокоуровневого дизайна; становится аккуратнее !. Основной цикл, который проверяет все, что вы можете сделать, в конечном итоге оказывается медленным и расточительным для ЦП, но гарантирует производительность. (Гарантированно будет медленным)

Кешируйте результаты, лениво создавайте вещи. Пользователи ожидают, что устройство будет медленным, поэтому не разочаровывайте их. Меньше бега - лучше. Беги как можно реже. Отдельные потоки могут быть отключены, когда они вам больше не нужны.

Постарайтесь получить больше памяти, чем вам нужно, тогда вы можете вставить более чем в одну хеш-таблицу и сохранить при поиске. Это прямой компромисс, если память DRAM.

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

person Tim Williscroft    schedule 15.09.2008

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

person 1800 INFORMATION    schedule 15.09.2008

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

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

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

person Garry Shutler    schedule 15.09.2008
comment
Я поддерживаю это. Если вы используете встроенный микроконтроллер, такой как PIC, отключите периферийные устройства, которые вы не используете активно, например, аналого-цифровые преобразователи или последовательный порт. - person MrZebra; 30.09.2008

Избегать опроса - хорошее предложение.

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

person geschema    schedule 21.04.2009

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

person Omer van Kloeten    schedule 15.09.2008

Посмотрите, что генерирует ваш компилятор, особенно для горячих участков кода.

person Ned    schedule 15.09.2008

Если у вас есть прерывистые операции с низким приоритетом, не используйте специальные таймеры для пробуждения, чтобы справиться с ними, но работайте с ними при обработке других событий.

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

person itj    schedule 15.09.2008

Проще говоря, делайте как можно меньше.

person Brian Knoblauch    schedule 30.09.2008

Что ж, поскольку ваш код может выполняться полностью в кеш-памяти процессора, у вас будет меньше активности шины и вы сэкономите электроэнергию. Если ваша программа достаточно мала, чтобы полностью уместить код + данные в кеше, вы получаете это преимущество «бесплатно». OTOH, если ваша программа слишком велика, и вы можете разделить свои программы на модули, которые более или менее независимы друг от друга, вы можете получить некоторую экономию энергии, разделив ее на отдельные программы. (Я полагаю, также можно создать цепочку инструментов, которая распределяет связанные пакеты кода и данных на куски размером с кеш ...)

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

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

person Toybuilder    schedule 21.10.2008

Установите для неиспользуемой памяти или флэш-памяти значение 0xFF, а не 0x00. Это, конечно, верно для флэш-памяти и eeprom, но не уверен в s или d ram. Для выпускных баллов есть инверсия, поэтому 0 сохраняется как 1 и требует больше энергии, 1 сохраняется как ноль и требует меньше. Вот почему вы читаете 0xFF после стирания блока.

person old_timer    schedule 18.05.2009
comment
Это похоже на микрооптимизации или микрооптимизации. - person Earlz; 10.12.2009

Довольно своевременная статья на Hackaday сегодня об измерении энергопотребления различными командами: Hackaday: эффект-кода-при-энергопотреблении

Кроме того:
- Прерывания - ваши друзья
- Polling / wait () - не ваши друзья
- Делайте как можно меньше
- сделайте свой код как можно более компактным / эффективным
- Отключите как можно больше модулей, выводов, периферийных устройств в микроконтроллере.
- Работайте как можно медленнее.
- Если микроконтроллер имеет настройки для силы контакта выводов, скорости нарастания и т. Д., Проверьте их и настройте, по умолчанию часто используется полная мощность / максимальная скорость.
- возвращаясь к статье выше, вернитесь и измерьте мощность и посмотрите, сможете ли вы отбросить ее, изменив вещи.

person John U    schedule 14.06.2012

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

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

также потратил некоторое время на проверку всех API встроенных устройств - например, большинство телефонов Symbian могут кодировать аудио через специализированное оборудование.

person Lorenzo Boccaccia    schedule 30.09.2008

Выполняйте свою работу как можно быстрее, а затем переходите в какое-то состояние ожидания, ожидая прерывания (или событий). Постарайтесь, чтобы код исчерпал кеш, используя как можно меньше трафика внешней памяти.

person jakobengblom2    schedule 23.09.2009

В Linux установите powertop, чтобы узнать, как часто какая программа выводит из спящего режима ЦП. И следуйте различным советам, на которые ссылается сайт powertop, некоторые из которых, вероятно, применимы и к не-Linux.

http://www.lesswatts.org/projects/powertop/

person Peter Cordes    schedule 10.12.2009
comment
Вы знаете, что случилось с анонсированной версией 2.0 PowerTop? Ссылка больше не доступна. - person JJD; 09.10.2011
comment
действительно поздний ответ, который, вероятно, легко решить с помощью Google, но выпущена версия 2.0. 01.org/powertop - person Peter Cordes; 20.05.2012

Выбирайте эффективные быстрые алгоритмы с небольшими базовыми блоками и минимальным доступом к памяти.

Узнайте о размере кэша и функциональных единицах вашего процессора.

Не обращайтесь к памяти. Не используйте объекты, сборку мусора или любые другие конструкции высокого уровня, если они расширяют ваш рабочий код или набор данных за пределы доступного кеша. Если вы знаете размер кэша и ассоциативность, разместите весь необходимый набор рабочих данных в режиме низкого энергопотребления и поместите все это в dcache (забудьте о некоторых «правильных» методах кодирования, которые разбрасывают данные по отдельным объектам или данным структур, если это вызывает мусор кеша). То же самое со всеми подпрограммами. Поместите свой рабочий код в один модуль, если необходимо, чтобы разделить его все в icache. Если процессор имеет несколько уровней кеш-памяти, попробуйте использовать самый низкий из возможных уровней кэширования инструкций или данных. Не используйте модуль с плавающей запятой или любые другие инструкции, которые могут активировать любые другие дополнительные функциональные модули, если только вы не можете убедительно доказать, что использование этих инструкций значительно сокращает время, в течение которого ЦП выходит из спящего режима.

и Т. Д.

person hotpaw2    schedule 29.08.2010

Не опрашивай, спи

По возможности избегайте использования энергоемких участков микросхемы. Например, множители потребляют много энергии, если вы можете сдвигать и добавлять, вы можете сэкономить несколько джоулей (пока вы не будете так много сдвигать и добавлять, что на самом деле множитель - это выигрыш!)

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

person Martin Thompson    schedule 15.06.2012