Используют ли инструкции sse больше энергии/энергии?

Очень простой вопрос, возможно, сложный ответ:

Использует ли SSE-команды, например, для параллельных операций sum/min/max/average, большую мощность, чем любые другие команды (например, одна сумма)?

Например, на Wikipedia Я не мог найти никакой информации в этом отношении.

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

Ответ 1

Я действительно изучал это несколько лет назад. Ответ зависит от вашего вопроса:

В современных процессорах потребляемая мощность не очень определяется типом команды (скалярным или SIMD), а скорее всего остальным, например:

  • Память/кэш
  • Расшифровка команд
  • OOE, зарегистрировать файл
  • И многое другое.

Итак, если вопрос:

При прочих равных условиях: имеет ли SIMD-команда больше мощности, чем скалярная инструкция.

Для этого я осмелюсь сказать "да".

Один из моих проектов в аспирантуре в конечном итоге стал этим ответом: боковое сравнение SSE2 (двухстороннее SIMD) и AVX (4-сторонняя SIMD ) на самом деле показали, что у AVX было заметно более высокое энергопотребление и более высокие температуры процессора. (Я не помню точных цифр, хотя.)

Это связано с тем, что код идентичен между SSE и AVX. Только ширина инструкции была другой. И версия AVX удвоила работу.

Но если вопрос:

Будет ли векторизация моего кода для использования SIMD потреблять больше энергии, чем скалярная реализация.

Здесь много факторов, поэтому я избегу прямого ответа:

Факторы, снижающие потребление энергии:

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

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

Факторы, которые увеличивают потребление энергии:

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

Разрушение:

  • Меньше инструкций → меньше накладных расходов для их выдачи и выполнения → меньше энергии
  • Более быстрый код → запустить меньше времени → меньше энергии
  • SIMD требует больше энергии для выполнения → больше мощности

Таким образом, SIMD экономит ваше питание, делая ваше приложение меньше времени. Но пока он работает, он потребляет больше энергии за единицу времени. Кто победит, зависит от ситуации.

По моему опыту, для приложений, которые получают выгодное ускорение от SIMD (или любого другого метода), прежний обычно выигрывает и потребление энергии снижается.

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

Для моего компьютера, просто удерживая его (бездействует), уже нарисовано более половины того, что он может нарисовать под всеобщей SIMD-нагрузкой, такой как prime95 или Linpack. Поэтому, если я могу сделать приложение 2x быстрее с помощью SIMD/распараллеливания, я почти наверняка сохранил силу.

Ответ 2

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

Это в целом справедливо не только для векторизации SIMD, но и для почти всей оптимизации. Более быстрый код не только быстрее, но (почти повсеместно) более энергоэффективен.

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

Ответ 3

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

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

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

Изменить: я изменил слова power на энергию, так как энергия - это энергия/время. Я думаю, что правильная вещь для сравнения - это что-то вроде FLOPS/watt

Позвольте мне объяснить. Мощность процессора равна C*V^2*f, где C - емкость, V - напряжение, а f - частота. Если вы прочтете эту статью "Оптимизация мощности с помощью преобразований" , вы можете показать, что использование двух ядер на половине частоты использует только 40% мощности одного ядра на полной частоте до одного и того же расчета за тот же промежуток времени.

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

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