Где VPERMB в AVX2?

AVX2 имеет много хороших вещей. Например, в нем есть множество инструкций, которые в значительной степени более мощные, чем их предшественники. принимать VPERMD: он позволяет полностью произвольно транслировать / перетасовывать / переставлять из одного 256-битного вектора 32-битных значений в другой с перестановкой, выбираемой во время выполнения 1. Функционально это устарело из множества старых инструкций по распаковке, трансляции, перестановке, перемешиванию и смене 3.

Холодные бобы.

Так где же VPERMB? То есть та же инструкция, но работающая с байтовыми элементами. Или, если на то пошло, где 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 решила даже не внедрять его в розничные процессоры для настольных ПК в течение нескольких поколений.

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

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


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

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


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

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

Другие вопросы по тегам