2016-06-23 2 views
11

У 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.

Более старые инструкции иногда полезны, если они имеют более короткое кодирование или не загружают маску из памяти, но функционально они заменяются.

+0

s/болтовня/dabble /? Кроме того, хороший термин для «selectable at runtime» - «переменная перетасовка». Инструкции переменной смены (например, ['vpsrlvd'] (http://www.felixcloutier.com/x86/VPSRLVD:VPSRLVQ.html)) уже используют эту терминологию. –

+0

Да, * dabble *, хотя болтовня тоже имеет смысл время от времени. Я не уверен в «переменной». Я вижу, что предмет сдвига является почти ортогональным «немедленной или нет». Проблема заключалась в том, что вы не могли выдавать разные значения сдвига для разных векторных элементов. Немного похоже, что если vector 'add' разрешил добавлять только одно значение ко всем элементам. Это отличается от того, может ли аргумент быть указан только как немедленный. Предоставленный сдвиг немного особенный, потому что у большинства даже нет этой проблемы, у меня сложилось впечатление, что Intel означает «переменная». – BeeOnRope

+0

О, хорошо, у вас уже есть счет сдвига для всех элементов в low64 xmm reg. Тем не менее, я думаю, что «переменная перетасовка» сразу становится очевидной без объяснения причин, учитывая немного контекста. –

ответ

10

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

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

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

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

Согласно Википедии, 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 инструкция довольно много среди наиболее полезных инструкций всех времен.

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

+0

Половина пути ответа, я собирался сказать: «Хорошо, конечно, но что сказал бы парень-аппаратчик?» - но тогда это то, что вы сказали :). Я предполагаю, что мультиплексоры занимают много транзисторов, но поскольку PSHUFB уже существует, у вас на самом деле уже есть 32x 16: 1 мультиплексоры. Таким образом, кажется, что выполнение дополнительного однобитового поиска и смешения должно быть довольно простым в трехцикличном бюджете. Большая часть оборудования для перекрестных полос, вероятно, также существует из-за существующих перекрестных перекрестков. Мой реальный опыт разработки аппаратного обеспечения на вашем компьютере уже на одном уровне с вашим. – BeeOnRope

+1

О vpermi2b, я когда-то думал, что эта удивительная инструкция скоро появится в AVX512F, но теперь кажется, что мы не получаем ее до AVX512VBMI.Не знаю, когда это расширение наступит. Однако некоторые из более слабых форм обнаруживаются в расширениях F и BW. – BeeOnRope

+0

@BeeOnRope: черт возьми, я тоже пропустил этот факт. Википедия говорит, что запланировано для Cannonlake. Я думал, что это было в AVX512BW, в Skylake Purley. Но вы правы, и даже 'vpermb' - это AVX512VBMI. Я все еще разочарован тем, что в ядрах SKL, выпущенных в Xeon, нет AVX512, на что я надеялся. Это только намного более дорогие Xeons, которые будут поддерживать его, что засасывает доступный домашний рабочий стол :( –

Смежные вопросы