Где VPERMB в AVX2?

У 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 Более старые инструкции иногда полезны, если они имеют более короткое кодирование или не загружают маску из памяти, но функционально они заменяются.

Ответ 1

Я на 99% уверен, что основным фактором является стоимость реализации транзистора. Очевидно, что это будет очень полезно, и единственная причина, по которой он не существует, заключается в том, что стоимость реализации должна перевесить значительную выгоду.

Проблемы с кодированием пространства маловероятны; Кодирующее пространство VEX обеспечивает много места. Например, очень много, так как поле, представляющее комбинации префиксов, не является битовым полем, оно представляет собой целое число с большинством неиспользуемых значений.

Они решили реализовать его для AVX512VBMI, хотя с большими размерами элементов доступны в AVX512BW и AVX512F. Может быть, они поняли, как сильно это сосало, чтобы этого не было, и решил сделать это в любом случае. AVX512F занимает много площадей/транзисторов для реализации, так что Intel решила не реализовывать его в розничных настольных CPU для нескольких поколений.

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

Согласно Википедии, AVX512VBMI не наступает до Cannonlake, но тогда у нас будет vpermi2b, который выполняет 64 параллельных поиска таблиц из таблицы 128B (2 вектора zmm)). Skylake Xeon принесет только vpermi2w и более крупные размеры элементов (AVX512F + AVX512BW).


Я уверен, что тридцать два мультиплекса 32: 1 намного дороже восьми мультиплексоров 8: 1, даже если мультиплексоры 8: 1 имеют ширину 4x.. Они могли бы реализовать его с несколькими этапами перетасовки (а не с одной ступени 32: 1), так как переходы с переходом между полосами получают 3-тактный временной бюджет, чтобы выполнить свою работу. Но все еще много транзисторов.

Мне бы хотелось увидеть менее волнистый ответ от кого-то с опытом проектирования аппаратного обеспечения. Я построил цифровой таймер из фишек счетчика TTL на макете один раз (и IIRC, зачитал счетчик от BASIC на TI-99/4A, который был очень устаревшим даже ~ 20 лет назад), но об этом.


Довольно ясно, что команда SSE PSHUFB в значительной степени относится к числу наиболее полезных инструкций всех времен.

Угу. Это была первая переменная-перетасовка, с контрольной маской из регистра вместо немедленной. Поиск маски в случайном порядке из LUT тасовидных масок на основе результата pcmpeqb/pmovmskb может сделать некоторые сумасшедшие мощные вещи. @stgatilov IPv4 dotted-quad → int converter - один из моих любимых примеров удивительных трюков SIMD.