У AVX2 много хороших вещей. Например, в нем имеется множество инструкций, которые в значительной степени являются более мощными, чем их предшественники. Возьмите VPERMD
: он позволяет полностью произвольно транслировать/перетасовывать/переставлять из одного 256-битного вектора 32-битных значений в другой, с перестановкой, выбираемой во время выполнения 1. Функционально это уничтожает целый набор существующих старых команд распаковки, трансляции, перестановки, тасования и сдвига 3.
Прохладный beans.
Итак, где VPERMB
? I.e., ту же инструкцию, но работает с элементами размера байта. Или, если на то, где VPERMW
, для 16-битных элементов? В течение некоторого времени провалялся на сборке x86, довольно ясно, что инструкция SSE PSHUFB
в значительной степени относится к числу самых полезных инструкций всех времен. Он может делать любую возможную перестановку, широковещательную или байт-мутную перетасовку. Кроме того, его также можно использовать для 16 параллельных 4-битных → 8-битных табличных поисков 2.
К сожалению, PSHUFB
не был расширен, чтобы быть перекрестным в AVX2, поэтому он ограничен поведением внутри полосы. Инструкции VPERM
могут выполнять перекрестный перетасовки (на самом деле, "perm" и "shuf" кажутся синонимами в командной мнемонике?) - но 8 и 16-битные версии были опущены?
Кажется, что не очень хороший способ эмулировать эту инструкцию, тогда как вы можете легко эмулировать перетаскивания большей ширины с меньшими размерами (часто это даже бесплатно: вам просто нужна другая маска).
Я не сомневаюсь, что Intel знает о широком и интенсивном использовании PSHUFB
, поэтому естественно возникает вопрос, почему вариант байта был опущен в AVX2. Является ли операция по-прежнему сложнее реализовать на оборудовании? Существуют ли ограничения в кодировании, заставляющие его игнорировать?
1 По выбору во время выполнения я имею в виду, что маска, определяющая поведение перетасовки, поступает из регистра. Это делает команду на порядок более гибкой, чем более ранние варианты, которые принимают немедленную маску тасования, таким же образом, что add
более гибкая, чем inc
, или переменный сдвиг более гибкий, чем немедленный сдвиг.
2 Или 32 таких поиска в AVX2.
3 Более старые инструкции иногда полезны, если они имеют более короткое кодирование или не загружают маску из памяти, но функционально они заменяются.