Какой код потребляет меньше энергии?

Моя цель - разработать и внедрить "зелёный" алгоритм для некоторых особых ситуаций. Я разработал два алгоритма для одного и того же.

Один имеет большое нет. доступ к памяти (загрузка и хранение). Модель некоторое время объединяется и некоторое время не объединяется. Я предполагаю худший случай, когда большая часть доступа приведет к сбою кэша. Смотрите образец кода а).

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

Как мне оценить энергопотребление в каждом конкретном случае. Какой из них более энергоэффективен и почему?

Платформа: я буду запускать эти коды на процессоре Intel I3, с Windows 7, с 4 ГБ DRAM, 3 МБ кэш-памяти.

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

ОБНОВИТЬ:

Это сложно, но не невозможно. Можно очень хорошо рассчитать затраты, понесенные при чтении DRAM и выполнении умножения на ALU ЦП. Единственное, нужно обладать необходимыми знаниями об электронике DRAMS и CPU, которых мне не хватает на данный момент. По крайней мере, в худшем случае, я думаю, это вполне можно установить. В худшем случае это означает, что нет объединенного доступа, нет оптимизации компилятора.

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

a) for(i=0; i<1000000; i++)

  {

  a[i]= b[i]; //a, b floats in RAM.  

  {




 b) for(i=1; i<1000000; i++)

  {

   float j= j * i;  //j has some value. which is used later in the program , not  
                    // shown here    

  {

5 ответов

Решение

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

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


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

Особенно обратите внимание на пункт " Инструменты" в "Контрольном списке" выше, поскольку в нем перечислены некоторые инструменты, которые могут помочь вам в приблизительных оценках (на основе профилирования приложения). В нем перечислены (помимо других):

  • Perfmon
  • PwrTest / Windows Driver Kit
  • Средство просмотра событий Windows (события изменения отметки времени, журнал Microsoft-Windows-Kernel-PowerDiagnostic)
  • Intel PowerInformer
  • Windows ETW (структура мониторинга производительности)
  • Intel Application Energy Toolkit

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

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

Здесь я предполагаю, что основным потребителем энергии является процессор, а алгоритмы не требуют интенсивного ввода-вывода.

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

Это может быть не на 100% точно, но так близко, как вы можете получить без фактического измерения.

Ну, я сделал с моим предварительным исследованием и обсуждениями с основными специалистами в области электроники.

Грубая идея может быть получена с учетом двух факторов:

1- вовлеченные токи: больше тока, больше рассеиваемая мощность.

2- Рассеиваемая мощность из-за тактовой частоты. Рассеиваемая мощность зависит от квадрата частоты.

В сниппете а) DRAM и память вряд ли потребляют много тока, поэтому рассеиваемая мощность будет очень мала во время каждого

  a[i]= b[i];

операция. Вышеуказанная операция - только чтение и запись данных.

Кроме того, тактирование памяти обычно очень мало по сравнению с процессором. В то время как процессор работает на частоте 3 ГГц, память работает на частоте около 133 МГц или около того. (Не все компоненты работают на номинальных часах). Таким образом, рассеиваемая мощность ниже из-за более низких тактовых импульсов.

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

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

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

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

Другие вопросы по тегам