Какой смысл в инструкции VPERMILPS (_mm_permute_ps)? - PullRequest
0 голосов
/ 13 января 2019

В наборе команд AVX появился VPERMILPS, который представляется упрощенной версией SHUFPS (для случая, когда оба входных регистра одинаковы).

Например, следующая инструкция:

c5 f0 c6 c1 00          vshufps xmm0,xmm1,xmm1,0x0

можно заменить на:

c4 e3 79 04 c1 00       vpermilps xmm0,xmm1,0x0

Как видите, версия VPERMILPS занимает один байт дополнительно и делает то же самое. Согласно таблицам инструкций обе инструкции занимают 1 цикл ЦП и имеют одинаковую пропускную способность.

Какой смысл вводить такие инструкции? Я что-то упустил?

EDIT: есть одно различие между этими двумя инструкциями. VPERMILPS устанавливает верхние полосы на ноль, а SHUFPS оставляет их без изменений.

1 Ответ

0 голосов
/ 13 января 2019

Да, использование vpermilps -immediate обычно является пропущенной оптимизацией по сравнению с vshufps (за исключением посадки Найта), тратя впустую 1 байт размера кода для той же операции с той же производительностью.


Я думаю, что основной смысл vpermilps в том, что он доступен с операндом векторного управления. До AVX единственная переменная переменная управления была целое число pshufb.

VPERMILPS ymm1, ymm2, ymm3/m256 - Перестановка значений с плавающей запятой одинарной точности в ymm2 с использованием элементов управления из ymm3 / m256 и сохранение результата в ymm1.


Но, конечно, у немедленной формы есть совершенно отдельный код операции, и вы спрашиваете, почему это существует. Intel определенно могла бы включить только векторную версию, поэтому возникает вопрос «почему они включили немедленную версию?» Требуется хотя бы немного дополнительного аппаратного обеспечения декодирования. У перемешивающего устройства уже есть оборудование для распаковки непосредственных управляющих операндов в этой форме, потому что оно идентично vshufps, так что, возможно, это было дешево для реализации?

Единственное, что вы можете сделать с немедленным vpermilps, чего не можете сделать с vshufps, это load + shuffle в одной инструкции , например vpermilps ymm0, [rdi], 0b00011011, чтобы обратить элементы в каждой полосе источник. Но, как и большинство инструкций с немедленной обработкой, он не может микрозонить операнд памяти, поэтому для внешнего интерфейса это все еще 2 мопа слитых доменов. (На процессорах AMD это действительно экономит полосу пропускания внешнего интерфейса.) Тем не менее, он сохраняет размер кода по сравнению с vmovups ymm0, [rdi] / vshufps ymm0,ymm0,ymm0, 0b00011011.

Кроме этого, я не вижу особого смысла. Они оба выполняют одно и то же тасование в обеих 128-битных дорожках, повторно используя 4x 2-битные поля непосредственных каналов для обеих полос. (Хотя vpermilpd и vshufpd оба используют 1-битные поля в своих непосредственных элементах и ​​могут выполнять различные тасования в каждой линии; верхняя линия использует биты 2 и 3. И версии ZMM используют биты 4..7 для верхних 256. Итак, снова vpermilpd dst, src, imm идентичен vshufpd dst, src,src, imm, если только вы не используете источник памяти или не используете вектор управления случайным порядком вместо непосредственного.)

Это заставляет задуматься, неужели Intel забыла, что кодирование VEX должно позволить неразрушающему vshufps делать то же самое для немедленных тасов.


Или, может быть, они имели в виду свои маломощные процессоры, такие как Knight's Landing (Xeon Phi), где перемешивание с одним источником дешевле:

vpermilps имеет 1-тактную пропускную способность, но vshufps или vperm2f128 имеет 2-тактную пропускную способность и дополнительный цикл задержки. (Согласно таблицам инструкций Агнера Фога .)

Таким образом, использование vshufps с одним и тем же входом в два раза медленнее.

Но на крупных центральных процессорах Intel, да, использование vpermilps -immediate является пропущенной оптимизацией по сравнению с vshufps, если только вы не можете использовать его с источником памяти. vshufps потребуется дважды один и тот же источник памяти, что явно не кодируется.

AVX был спроектирован на годы впереди KNL, но, возможно, разработчики ISA имели в виду, что, возможно, какой-то будущий ЦП мог бы быть более эффективным с более простым перемешиванием.

Обычный Silvermont (вышедший из строя Atom, на котором основан KNL) не поддерживает AVX, но имеет пропускную способность 1 моп / 1 цикл и задержку для shufps. Goldmont имеет пропускную способность 0.5c для shufps.

AFAIK, Intel до сих пор не сделала ядро ​​с низким энергопотреблением (кроме Xeon Phi) с AVX. Я не думаю, что они планируют с Tremont или Gracemont, преемниками Goldmont Plus.

...