SIMD инструкции по снижению частоты процессора - PullRequest
7 голосов
/ 02 июля 2019

Я прочитал эту статью .В нем говорилось о том, почему инструкция AVX-512:

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

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

Интересно, какие еще инструкцииПоддерживает ли Skylake аналогичный эффект, что они уменьшат мощность, чтобы максимизировать пропускную способность позже?Все инструкции с префиксом v (например, vmovapd, vmulpd, vaddpd, vsubpd, vfmadd213pd)?

Я пытаюсь составить список инструкций, которых следует избегать при компиляции моего C ++приложение для Xeon Skylake.

Ответы [ 2 ]

8 голосов
/ 03 июля 2019

Частота воздействия зависит от ширины инструкции и используемой инструкции.

Существует три уровня частоты, так называемые лицензии , от самого быстрого до самого медленного: L0, L1 и L2.L0 - это «номинальная» скорость, которую вы увидите на коробке: когда чип говорит «3,5 ГГц турбо», это относится к одноядерному L0 Turbo.L1 - это более низкая скорость, иногда называемая AVX turbo или AVX2 turbo 5 , первоначально связанная с инструкциями AVX и AVX2 1 .L2 - это более низкая скорость, чем L1, которую иногда называют «AVX-512 turbo».

Точные скорости для каждой лицензии также зависят от количества активных ядер.Для обновленных таблиц вы можете обратиться к WikiChip .Например, таблица для Xeon Gold 5120 здесь здесь :

Xeon Gold 5120 Frequencies

Строки Normal, AVX2 и AVX512 соответствуютЛицензии L0, L1 и L2 соответственно.Обратите внимание, что относительное замедление для лицензий L1 и L2 обычно ухудшается с увеличением количества ядер: для 1 или 2 активных ядер скорости L1 и L2 составляют 97% и 91% от L0, но для 13 или 14 ядер они составляют 85%.и 62% соответственно.Это зависит от чипа, но общая тенденция, как правило, та же.

Эти предварительные сведения, давайте вернемся к тому, что, я думаю, вы спрашиваете: , какие инструкции вызывают какие лицензии активируются ?

Вот таблица, показывающая подразумеваемую лицензию для инструкций на основе их ширины и их классификации как light или heavy :

   Width    Light   Heavy  
 --------- ------- ------- 
  Scalar    L0      N/A
  128-bit   L0      L0     
  256-bit   L0      L1*    
  512-bit   L1      L2*

*soft transition (see below)

Таким образом, мы сразу видим, что все скалярные (не SIMD) инструкции и все 128-битные инструкции 2 всегда работают на полной скорости в лицензии L0.

256-битные инструкции будут выполняться в L0 или L1, в зависимости от того, являются ли они легкими или тяжелыми , а 512-битные инструкции будут выполняться в L1 или L2 на той же основе.

Так что же это за легкая и тяжелая вещь?

Легкая против тяжелой

Начать проще всего с объяснения тяжелых инструкций.

Все тяжелые инструкции - это SIMD инструкции, которыенужно запустить на FP / FMA единица.В основном это большинство инструкций FP (обычно заканчивающихся на ps или pd, например addpd), а также integer инструкций умножения, которые в основном начинаются с vpmul или vpmad, так какЦелочисленное умножение SIMD фактически выполняется на модуле SIMD, а также vplzcnt(q|d), который, очевидно, также работает на модуле FMA.

Учитывая, что легкие инструкции - это все остальное.В частности, целочисленная арифметика, кроме умножения, логических инструкций, перемешивания / смешивания (включая FP) и загрузки и сохранения SIMD, является легкой.

Переходы

Записи L1 и L2 в Тяжелый столбец отмечен звездочкой, например L1*.Это потому, что эти инструкции вызывают переход soft , когда они происходят.Другая запись L1 (для 512-битных легких команд) вызывает сложный переход.Здесь мы обсудим два типа перехода.

Жесткий переход

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

Мягкий переход

В отличие от жестких переходов, мягкий переход не происходит сразу же, как толькоинструкция выполнена.Скорее, инструкции изначально выполняются с уменьшенной пропускной способностью (такой же медленной, как 1/4 их нормальной скорости), без изменения частоты.Если процессор решает, что «достаточно» тяжелые инструкции выполняют за единицу времени , и достигается определенный порог, происходит переход к лицензии с большим номером.

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

Рекомендации

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

Более того, вам никогда не придется беспокоиться о light 256-битовые инструкции, поскольку они также не вызывают разгона.Если вы не используете много векторизованной математики FP, вы вряд ли будете использовать тяжелые инструкции, так что это будет относиться к вам.Действительно, компиляторы уже свободно вставляют 256-битные инструкции, когда вы используете соответствующую опцию -march, особенно для перемещения данных и автоматически векторизованных циклов.

Использование тяжелых инструкций AVX / AVX2 и легких инструкций AVX-512 сложнеепотому что вы будете работать в лицензиях L1.Если только небольшая часть вашего процесса (скажем, 10%) может воспользоваться, вероятно, не стоит замедлять работу остальной части вашего приложения.Штрафы, связанные с L1, обычно умеренные, но проверьте детали для вашего чипа.

Использование тяжелых инструкций AVX-512 еще сложнее, потому что лицензия L2 сопровождается серьезными частотными штрафами на большинстве чипов.С другой стороны, важно отметить, что только категории FP и команды умножения целых чисел попадают в категорию heavy , поэтому на практике большое количество целочисленных 512-битных команд будет использовать только лицензию L1.


1 Хотя, как мы увидим, это немного ошибочно, поскольку инструкции AVX-512 могут устанавливать скорость для этой лицензии, а некоторые инструкции AVX / 2 не't.

2 128-битная ширина означает использование регистров xmm, независимо от того, в каком наборе команд они были введены - основной AVX-512 содержит 128-битные вариантыдля большинства / всех новых инструкций.

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

4 Очевидно, мы говорим только о переходах на лицензию более высокого уровня, например, с L0 на L1, когда выполняется инструкция L1 с жестким переходом.Если вы уже находитесь в L1 или L2, то ничего не происходит - переход не происходит, если вы уже находитесь на том же уровне, и вы не переходите на уровни с меньшим номером, основанные на какой-либо конкретной инструкции, а скорее выполняете в течение определенного времени без каких-либо инструкцийуровень с более высоким номером.

5 Из двух AVX2 turbo встречается чаще, чего я никогда не понимал, потому что 256-битные инструкции так же связаны сAVX по сравнению с AVX2, и большинство тяжелых инструкций, которые фактически запускают AVX turbo (лицензия L1), на самом деле являются инструкциями FP в AVX, а не AVX2.Единственное исключение - целочисленные умножения AVX2.

6 голосов
/ 02 июля 2019

Важна не мнемоника инструкций, а 512-битная ширина вектора вообще .

Вы можете использовать 256-битную версию инструкций AVX-512VL, например, vpternlogd ymm0, ymm1, ymm2 без ущерба для турбо-штрафа AVX-512.

Related: Динамическое определение того, где выполняется мошенническая инструкция AVX-512. относится к случаю, когда одна инструкция AVX-512 в коде инициализации glibc или что-то оставило грязный верхний ZMM, который оставил максимальный турбо для остальных. времени жизни процесса. (Или до vzeroupper может быть)

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

В любом случае, именно поэтому gcc -march=skylake-avx512 по умолчанию -mpreferred-vector-width=256

Скажите GCC, чтобы он настроился на ваш процессор (например, -march=native), и он, надеюсь, сделает правильный выбор. Хотя на настольном Skylake-X турбо штраф меньше, чем у Xeon. И если ваш код действительно выигрывает от 512-битной векторизации, то стоит заплатить штраф.

(Также остерегайтесь другого важного эффекта перехода процессоров семейства Skylake в 512-битный векторный режим: векторные ALU на порту 1 отключаются, поэтому только скалярные инструкции, такие как popcnt или add, могут использовать порт 1. Пропускная способность vpand и vpaddb и т. Д. Снижается с 3 до 2 за такт.А если вы используете SKX с двумя 512-битными блоками FMA, дополнительный на порту 5 включается, поэтому FMA конкурируют с тасовками. )

...