У AVX2 есть много хорошего материала. Например, в нем имеется множество инструкций, которые в значительной степени являются более мощными, чем их предшественники. Возьмите VPERMD
: он позволяет полностью произвольно транслировать/перетасовывать/переставлять из одного 256-битного вектора 32-битных значений в другой, причем перестановка может быть выбрана во время выполнения . Функционально, что устаревает целый набор существующих старых команд распаковки, трансляции, перестановки, тасования и сдвига .Где находится VPERMB в AVX2?
Холодные бобы.
Итак, где VPERMB
? I.e., ту же инструкцию, но работает с элементами размера байта. Или, если на то пошло, где VPERMW
, для 16-битных элементов? В течение некоторого времени, занимаясь сборкой x86, довольно ясно, что инструкция SSE PSHUFB
в значительной степени относится к числу самых полезных инструкций всех времен. Он может делать любую возможную перестановку, широковещательную или байт-мутную перетасовку. Кроме того, его также можно использовать для 16 параллельных 4-битных -> 8-битных табличных поисков .
К сожалению, PSHUFB
не был расширен, чтобы быть перекрестным в AVX2, поэтому он ограничен поведением в пределах полосы. Инструкции VPERM
могут выполнять перекрестные перетасовки (по сути, «perm» и «shuf» кажутся синонимами в командной мнемонике?) - но 8 и 16-битные версии были опущены?
Существует не очень хороший способ эмулировать эту инструкцию, тогда как вы можете легко эмулировать перетасовку большей ширины с меньшими ширинами (часто это даже бесплатно: вам просто нужна другая маска).
Я не сомневаюсь, что Intel знает о широком и интенсивном использовании PSHUFB
, поэтому естественно возникает вопрос, почему в AVX2 вариант байта был опущен. Является ли операция по-прежнему сложнее реализовать на оборудовании? Существуют ли ограничения в кодировании, заставляющие его игнорировать?
По выбирается во время выполнения, я имею в виду, что маска, которая определяет поведение перетасовки происходит из регистра. Это делает инструкцию на порядок более гибкой, чем более ранние варианты, которые принимают немедленную тасовую маску, таким же образом, что add
более гибкий, чем inc
, или переменный сдвиг более гибкий, чем немедленный сдвиг.
Или 32 таких поиска в AVX2.
Более старые инструкции иногда полезны, если они имеют более короткое кодирование или не загружают маску из памяти, но функционально они заменяются.
s/болтовня/dabble /? Кроме того, хороший термин для «selectable at runtime» - «переменная перетасовка». Инструкции переменной смены (например, ['vpsrlvd'] (http://www.felixcloutier.com/x86/VPSRLVD:VPSRLVQ.html)) уже используют эту терминологию. –
Да, * dabble *, хотя болтовня тоже имеет смысл время от времени. Я не уверен в «переменной». Я вижу, что предмет сдвига является почти ортогональным «немедленной или нет». Проблема заключалась в том, что вы не могли выдавать разные значения сдвига для разных векторных элементов. Немного похоже, что если vector 'add' разрешил добавлять только одно значение ко всем элементам. Это отличается от того, может ли аргумент быть указан только как немедленный. Предоставленный сдвиг немного особенный, потому что у большинства даже нет этой проблемы, у меня сложилось впечатление, что Intel означает «переменная». – BeeOnRope
О, хорошо, у вас уже есть счет сдвига для всех элементов в low64 xmm reg. Тем не менее, я думаю, что «переменная перетасовка» сразу становится очевидной без объяснения причин, учитывая немного контекста. –