Разработка энергоэффективного ПО

Скачать статью

Developing Green Software

Введение

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

Режимы Р и С энергопотребления процессора

Процессор представляет основной интерес для разработчиков программного обеспечения. Понимание определенных состояний энергопотребления процессора может помочь в борьбе за энергоэффективность. Важно, чтобы в периоды, когда процессор занят активной обработкой информации или выполнением вычислений, он потреблял минимальное количество энергии. Процессор имеет С-состояния и Р-состояния. C-состояния – это режимы питания ядра, которые определяют степень "сна" процессора. В состоянии С0 процессор активен и выполняет определенные команды. В этом режиме, процессор может работать на различных уровнях частоты, в зависимости от P-состояния.

Между периодами активности процессор имеет возможность для отдыха. На самом деле, C-состояния часто означают состояния "сна". Процессоры Intel® поддерживают несколько уровней С-состояний ядра и пакетов (ресурсы, общие для всех ядер), которые обеспечивают гибкий выбор между потреблением энергии и отзывчивостью. С каждым более глубоким уровнем сна, некоторые новые части процессора выключаются, в результате чего сохраняется больше энергии. Чем глубже сон, тем больше энергии экономится. Даже если период сна составляет всего 100 микросекунд, со временем значительное количество энергии может быть сохранено.

P-состояния, или состояния выполнения, определяют частоту, с которой процессор работает. Различные марки процессоров представляют P-состояния как функции, такие как SpeedStep в процессорах Intel, PowerNow!, Cool'n'Quiet в процессорах AMD и PowerSaver в процессорах VIA. Стандартные P-состояния:

  • P0 - максимальная мощность и частота
  • P1 – меньше, чем в P0, напряжение и частота дифференцированы
  • Pn - низкое номинальное напряжение и частота

Методы разработки энергосберегающего программного обеспечения

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

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

2.1 Вычислительная эффективность

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

Эффективные алгоритмы – это алгоритмы и структуры данных, которые уже давно являются объектом исследований в области компьютерных наук. Выбор различных алгоритмов и структур данных может коренным образом повлиять на производительность приложения. Для конкретной задачи стек может быть лучше, чем очередь, а B-дерево может быть лучше, чем бинарное или хэш-функции. Лучший алгоритм или структура данных для данной задачи зависит от многих факторов. Изучение проблемы и правильный выбор архитектуры, дизайна, алгоритмов и структур данных, поможет создать приложение, которое обеспечит более высокую производительность и при этом будет потреблять меньше энергии.

Многопоточность – многопоточность программного обеспечения дает более высокую производительность и энергоэффективность. Рассмотрим это на примере одного из наших любимых приложений для тестирования производительности - Cinebench 11.5 от MAXON Computer GmbH [1]. Измерим потребление энергии на 4-ядерном 8-поточном процессоре Intel. На рисунке 1 представлен график расходования энергии процессором по времени при использовании 1, 2, 4 и 8 потоков. Как видно, выполнение работы с одним потоком занимает значительно больше времени и требует больше энергии, чем любой из многопоточных вариантов. В среднем в 8-поточном случае используется примерно на 25% меньше энергии, чем в однопоточном случае. Кроме того, 8-поточная версия была выполнена примерно за четверть расчетного времени, поэтому процессор мог быть использован для других вычислений.

Рис. 1: Измерение энергопотребления CPU с различных запусков CINEBENCH 11.5 на Intel Core i7 system.

Векторизация – это еще один метод достижения лучшей вычислительной эффективности, которая в данном случае достигается за счет векторизации кода, заменяющей использование скалярного C-кода с помощью усовершенствованных команд, таких как SIMD-инструкции (Single-Instruction Multiple Data) для параллелизма данных на уровне команд. Векторизация позволяет добиться более высокой производительности и получить выигрыш в мощности. Для того, чтобы проверить это, мы взяли 2 разных алгоритма декодирования аудио и оптимизировали их с помощью набора инструкций Intel ® Advance Vector Extensions (Intel ® AVX). В соответствии с данным методом мы должны включить и выключить функцию AVX и измерить производительность и среднюю мощность работы декодирования аудио. Когда AVX включен, работа выполняется значительно быстрее - на 1.65X и 1.34X с огромной экономией энергии. В таблице 1 приведены характеристики воздействия использования AVX на производительность и мощность.

Таблица 1: Влияние инструкций AVX на производительность и мощность.

2.2 Эффективность обработки данных

Эффективность обработки данных снижает затраты энергии за счет минимизации перемещения данных. Как показано в [2], эффективность обработки данных может быть достигнута следующими путями:

  • Использование алгоритмов, сводящих перемещение данных к минимуму;
  • Организация памяти таким образом, чтобы данные располагались рядом с обрабатываемыми элементами;
  • Эффективное использование кэша.

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

Управление операциями ввода / вывода – в данном разделе приведена краткая обобщающая информация о наших исследованиях характеристик мощности жесткого диска во время различных действий, а также руководящие принципы по оптимизации питания во время операций ввода / вывода. Дополнительную информацию, а также примеры кода можно найти в [3]. Анализ базируется на основных характеристиках жестких дисков (HDD), которые зависят от количества оборотов в минуту, времени поиска, ожидания вращения и устойчивой скорости передачи данных. Кроме того, фактическая пропускная способность системы будет также зависеть от физического расположения данных на диске. Ниже приведены результаты четырех отдельных экспериментов, помогающих лучше понять энергопотребление жестких дисков при использовании различных методик ввода / вывода.

Гипотеза: При чтении значительных объемов последовательных данных, чтение данных большими кусками требует меньшего использования процессора и является более энергоэффективным.

Рекомендация: Используйте блок размером 8 Кбайт и более для повышения производительности.

Гипотеза: Эффективное использование асинхронного ввода / вывода с Native Command Queuing (NCQ) повышает производительность и экономит энергию.

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

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

Рекомендация: Избегайте этого путем предварительного выделения места для больших последовательных файлов при их создании, например, SetLength в .NET Framework *. Используйте NtFsControlFile (), чтобы помочь в дефрагментации файлов. Конечные пользователи могут периодически дефрагментировать диск.

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

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

Предварительная выборка и кэширование – мы также провели отдельное исследование для того, чтобы определить, позволяют ли предварительная выборка и кэширование экономить энергию во время воспроизведения DVD. Подробнее о данном исследовании можно узнать в [4]. В этой работе мы проанализировали энергопотребление трех различных приложений воспроизведения DVD (DVD App № 1, № 2 и № 3) с многочисленными внеоконными конфигурациями, измеряя мощность - в первую очередь, сравнивали режим максимального энергосбережения с режимом без энергосбережения. Для проведения исследования был взят обычный DVD фильм, который был включен в MobileMark 2005 [5] с инструментами для тестирования. В результате эксперимента было выявлено, что раскрутка DVD-диска требует наибольшей энергии (более 4 Вт за короткий период), а снижение времени раскрутки может привести к экономии энергии. В ходе непрерывного чтения DVD потребляется около 2,5 Вт мощности, что является еще одной областью для потенциальной экономии.

В таблице 2 представлены данные о текущем потреблении энергии для трех приложений воспроизведения DVD-дисков. Важно отметить, что разница в потреблении энергии между худшим случаем потребления (приложение 2, 10143 mWHrs) и лучшим (App 3, 6023 mWHrs) составляет более 4000 mWHrs, притом эта разница вызвана исключительно выбором конструкций, сделанным разработчиками приложений. При этом экономится примерно 40% энергии. Экономия даже 10% энергии для 4-часового аккумулятора обеспечивает дополнительные 24 минуты времени автономной работы на стандартном ноутбуке.

Таблица 2: Потребление энергии во время воспроизведения DVD-дисков.

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

  • Буферизация: исследования показали, что метод буферизации, встроенный в DVD приложение # 1 снижает энергопотребление DVD на 70%, при этом общее энергопотребление платформы на 10% меньше, чем при использовании других методов.
  • Минимизация использования DVD диска: сокращение раскрутки DVD, замедление вращения и доступ только для чтения в целях экономии энергии.
  • ОС управляет частотой процессора: мы не рекомендуем менять схему питания CPU для запуска процессора на самых высоких доступных частотах. Позвольте ОС установить нужное Р-состояние, регулируя частоту процессора при необходимости.

2.3 Информированность о контексте

Как правило, люди прибегают к контексту, чтобы понять мир, адаптироваться к окружающей среде и самостоятельно принимать решения. Информированность о контексте в случае с компьютерами означает, что компьютер может «чувствовать» окружающую среду, в которой работает. Программа может быть разработана так, чтобы она могла реагировать на изменения в окружающей среде. Контекст осведомленности впервые было упомянут Schilit в 1994 г. [6]. Цель в данном случае заключается в создании приложений, которые могут реагировать или адаптироваться к изменениям в окружающей среде. Для физической среды в этом случае требуются датчики и способность генерировать события или изменения состояния. Вот некоторые примеры информированности о контексте: ноутбук реагирует на изменения питания от сети переменного или постоянного тока за счет автоматического затемнения дисплея; или устанавливает головки жесткого диска в безопасное положение, когда датчики определяют, что устройство падает - чтобы избежать повреждения головки. Встроенные системы особенно остро нуждаются в информированности о контексте, потому что зачастую они специально предназначены для мониторинга состояния окружающей среды с помощью датчиков и реагирования на изменения. Датчики, в частности, датчики света, гироскопы, акселерометры, GPS приемники, беспроводная связь, все активнее и активнее используются в смартфонах и планшетах.

Контекстная осведомленность делает наши устройства "умнее", при этом поведение приложения может быть как пассивным, так и активными. При пассивной реакции на изменение приложение либо спрашивает у пользователя, какие действия предпринять ("Переключить на режим экономии энергии?"), либо информирует, что произошло изменение состояния ("У вас осталось 10% заряда, OK?"). При активной реакции приложение будет действовать автоматически, либо в качестве встроенной функции (яркость дисплея в темном помещении), либо настраиваемой пользователем (пропустить полное сканирование системы на вирусы, когда питается от батареи). Мы считаем, что приложения могут использовать информацию о контексте для экономии энергии. Рассмотрим подробно два примера и обозначим некоторые другие для дальнейших исследований.

Переменный или постоянный ток? - Есть ли польза от того, что приложение знает, подключен ли ноутбук к источнику питания переменного тока или работает от батареи? В большинстве случаев, да. В Windows, вы можете добиться этого путем запроса уникального GUID, который называется GUID_ACDC_POWER_SOURCE [7]. Вооружившись этой информацией, вы можете адаптировать поведение приложения и по возможности правильно расходовать заряд батареи для текущего использования.

Планы электропитания - Microsoft Windows предоставляет встроенные планы электропитания - "Высокая производительность", "Сбалансированный" и "Экономия энергии". Они дают пользователю системы возможность выбора между более высокой производительностью и большим временем автономной работы. Прикладное программное обеспечение может использовать план электропитания одним из следующих способов: настройка поведения приложения на основе нынешнего плана электропитания, изменение поведения приложения в ответ на изменения в плане электропитания или изменение политики электропотребления в соответствии с приложением. В данном случае, как и в предыдущем, может быть применен GUID Windows. Для получения дополнительной информации о том, как использовать этот API см. [8].

Дополнительные контекстно-зависимые поведения - Разработчики могут изучить состояние других компонентов платформы и использовать эту информацию для разумного поведения приложений и энергосбережения. Полезно знать информацию о состоянии таких компонентов, как сетевые карты, Bluetooth, Wi-Fi, USB устройства, мониторы и т.д. Например, должно ли приложение продолжать показывать видео, если монитор выключен из-за тайм-аута или если приложение свернуто? Microsoft System Event Notification Service (SENS) может облегчить создание хорошего мобильного приложения. SENS API, распространяемое вместе с Intel Mobile Platform SDK, обеспечивает простой вызов функции для проверки подключения к сети, а также функции, которая будет пинговать указанный адрес. Помимо этого, вы можете подписаться на услугу получения уведомлений при подключении или отключении, пинга, а также использовать сервис в качестве альтернативного метода для определения изменений в состоянии энергопотребления (работает батарея, работает AC или батарея разряжена).

Эффективность ожидания

Энергопотребление в режиме бездействия для мобильных платформ определяется как потребляемая мощность, когда система работает в ACPI S0 состоянии (S3-sleep или S4-Hibernate) с приложениями и службами, работающими, но неактивно выполняющими работу. В этом состоянии должна присутствовать минимальная фоновая активность. На рисунке 2 (см. также [9]) показаны измерения потребления энергии во время работы Mobile Mark 2007 на компьютере [5]. Этаж простоя находится на уровне 8 Вт – примерно так же низко, как может быть в состоянии С0 на этой конкретной платформе. Как было отмечено в разделе 1, C0 – это состояние, в котором процессор считается полностью активным. Изучив данные о C-состоянии в данном сеансе, мы определили, что даже при таких активных тестах, как MM07, платформа была в C0 только в 5-10% случаев. Другими словами, процессор был в нерабочем состоянии – ниже, чем C0 – 90-95% времени. Задача состоит в том, чтобы снизить этаж простоя путем повышения эффективности приложений, что приведет к значительному увеличению срока службы аккумулятора. Также это будет способствовать увеличению средней мощности и решит проблемы едва ли не самых требовательных (TDP-подобных) нагрузок.

Рис. 2: Платформа мощности во время работы MobileMark 2007.

Время пребывания в глубоком С-состоянии

Одним из ключевых требований к эффективности ожидания является поддержание платформы в более глубоких C-состояниях сколь возможно долго. Для платформы в состоянии покоя, в идеале, время пребывания в глубоких C-состояниях (C6/C7) должно составлять более 90%. Программное обеспечение должно стремиться минимизировать количество С-переходов между состояниями. Частые переходы C-состояний от простоя к активному не являются энергетически эффективными. Активности должны быть по возможности соединены, чтобы обеспечить наименьшие изменения C-состояний. Частые переходы C-состояний влияют на потребление энергии в двух направлениях:

  • Потребности в энергии для входа / выхода из C-состояний не являются тривиальными. При очень малой продолжительности С0 (активный) задержка перехода в и из C-состояния заметна и может привести к чистой потере энергии.
  • Аппаратная политика может перевести C-состояние в более низкое состояние на основе эвристики. Даже если С-переход происходит только в течение 2-3msec в окне на 15.6msec, аппаратная политика может либо понизить основное C-состояние, либо вновь открыть пакет уровня кэша, и это повлияет на мощность остальных ~ 12-13msec периода простоя.

Чтобы уменьшить количество переходов между C-состояниями в приложениях и сервисах, мы рекомендуем не разделять задачи между процессами / потоками, если не будет параллельного выполнения. Если необходимо, чтобы задача была разделена между процессами, следует планировать работу так, чтобы количество С-переходов между состояниями было наименьшим. Кроме того, приложения и сервисы должны сливаться при выполнении, чтобы можно было увеличить время состояния ожидания.

Таймер ОС

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

Многие приложения вызывают timeBeginPeriod со значением 1, чтобы увеличить разрешение таймера на не более чем 1 мс для поддержания графической анимации, воспроизведения звука или видео. Это не только увеличивает разрешение таймера для приложения в 1 мс, но и влияет на глобальное разрешение системного таймера, так как Windows использует более высокое разрешение (то есть, самый низкий интервал), чем любые запросы приложений. Поэтому, если только одно приложение запрашивает разрешение таймера в 1 мс, система устанавливает таймер интервала (также называется "системный тик таймера"), по крайней мере, на 1 мс. Как правило, установка значения таймера меньше 10 мс может негативно повлиять на срок службы батареи. Современные процессоры и чипсеты, особенно в портативных платформах, используют время простоя между интервалами системного таймера для снижения энергопотребления системы. Различные компоненты процессоров и чипсетов размещены в маломощных простоях между таймером интервалов. Тем не менее, эти маломощные простои часто оказываются неэффективными для снижения энергопотребления системы, когда интервал системного таймера составляет менее 10 мс. На рисунке 3 показано влияние увеличения периода разрешения таймера на мощность платформы.

Рис. 3: Влияние на мощность увеличения периодического разрешения таймера.

И Windows Vista* и Windows* 7 поставляются с утилитой командной строки, которая называется Powercfg. Используя опцию /energy, можно применять Powercfg для определения того, увеличило ли приложение разрешение таймера платформы. Запустите утилиту PowerCfg во время работы приложения для изучения отчета, чтобы увидеть, изменило ли приложение разрешение таймера платформы. Также Powercfg показывает весь стек вызовов для запроса. В отчете перечисляются все случаи повышения разрешения таймера платформы и показывается, увеличило ли приложение разрешение таймера. Подробнее об этом можно узнать в разделе инструментов.

Другие рекомендации:

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

Фоновая активность

Частая периодическая фоновая активность повышает общее энергопотребление системы. Это влияет на мощность как процессора, так и чипсета. Длительные редкие события также мешают переходу системы от простоя ко сну. Фоновая деятельность на макроуровне (минуты, часы), такие как дефрагментация диска, антивирусное сканирование и т. д. также влияют на мощность. Win7 ввел единый менеджер фоновых процессов (UBPM), чтобы минимизировать силу воздействия на мощность фоновой деятельности. UBPM планирует сервисы и запланированные задачи и понятен для пользователей, ИТ-специалистов, а также для существующих API. Это дает возможность инициации запуска сервисов. Например, многие фоновые службы настроены на автоматический запуск и ожидание редких событий. UBPM позволяет инициировать запуск сервиса, на основании изменения окружающей среды. Примерами изменений окружающей среды могут служить: подключение/удаление устройства, изменение IP-адреса, подсоединение к домену и т.д. Пример инициализации запуска службы: запуск Bluetooth сервиса только тогда, когда Bluetooth радио подсоединено. Среди других усовершенствований Win7, позволяющих минимизировать частые фоновые активности, можно выделить следующие:

  • Ликвидация таймера TCP DPC на каждом прерывании системного таймера.
  • Снижение частоты таймера обслуживания USB.
  • Интеллектуальное распределение тика таймера.
  • Сливание таймеров.

Заключение

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

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

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

Есть много бесплатных инструментов от Intel и других компаний, которые помогут начать работу. Даже небольшое улучшение, которое распространяется на миллионы систем, может стать решающим.

Благодарность

Эксперименты и данные, приведенные в этой главе, основаны на многолетних исследованиях, проведенных инженерами корпорации Intel. Мы хотели бы отметить неустанный труд и значительный вклад в эту работу Rajshree Chabukswar, Jun De Vega, KarthikKrishnan, Manuj Sabharwal и Jamel Tayeb.

Pour de plus amples informations sur les optimisations de compilation, consultez notre Avertissement concernant les optimisations.
Étiquettes: