WikiDer > Набор инструкций XOP
В XOP (Расширенные операции[1]) Набор инструкций, объявленный AMD 1 мая 2009 г., является расширением 128-битной SSE основные инструкции в x86 и AMD64 набор инструкций для Бульдозер ядро процессора, выпущенное 12 октября 2011 года.[2] Однако AMD удалила поддержку XOP из Дзен (микроархитектура) вперед.[3]
Набор инструкций XOP содержит несколько различных типов векторных инструкций, поскольку изначально задумывался как серьезное обновление до SSE. Большинство инструкций являются целочисленными инструкциями, но они также содержат инструкции перестановки с плавающей запятой и извлечения дроби с плавающей запятой. См. Указатель для списка типов инструкций.
История
XOP - это переработанное подмножество того, что изначально задумывалось как SSE5. Он был изменен, чтобы быть похожим, но не пересекающимся с AVX, части, которые перекрывали AVX, были удалены или перемещены в отдельные стандарты, такие как FMA4 (вектор с плавающей запятой умножать – накапливать) и CVT16 (Половинная точность преобразование с плавающей запятой реализовано как F16C Intel).[1]
Все инструкции SSE5, которые были эквивалентны или похожи на инструкции в AVX и FMA4 Наборы инструкций, объявленные Intel, были изменены для использования кодировки, предложенной Intel. Целое число инструкции без эквиваленты в AVX были классифицированы как расширение XOP.[1] Инструкции XOP имеют байт кода операции 8F (шестнадцатеричный), но в остальном почти идентичная схема кодирования как AVX с 3-байтовым префиксом VEX.
Комментаторы[4] рассматривают это как доказательство того, что Intel не разрешила AMD использовать какую-либо часть большого пространства кодирования VEX. AMD была вынуждена использовать разные коды, чтобы избежать использования любой комбинации кода, которую Intel могла бы использовать в своем конвейере разработки для чего-то еще. Схема кодирования XOP максимально приближена к схеме VEX, насколько это технически возможно, без риска перекрытия кодов AMD с будущими кодами Intel. Этот вывод является спекулятивным, поскольку публичной информации о переговорах между двумя компаниями по этому вопросу нет.
Использование байта 8F требует, чтобы m-биты (см. Схема кодирования VEX) имеют значение больше или равное 8, чтобы избежать перекрытия с существующими инструкциями. Байт C4, используемый в схеме VEX, не имеет такого ограничения. Это может предотвратить использование m-битов для других целей в будущем в схеме XOP, но не в схеме VEX. Другая возможная проблема заключается в том, что биты pp имеют значение 00 в схеме XOP, в то время как они имеют значение 01 в схеме VEX для инструкций, которые не имеют устаревшего эквивалента. Это может усложнить использование битов pp для других целей в будущем.
Похожая проблема совместимости - это разница между FMA3 и FMA4 наборы инструкций. Первоначально Intel предложила FMA4 в спецификации AVX / FMA версии 3, чтобы заменить FMA с 3 операндами, предложенную AMD в SSE5. После того, как AMD приняла FMA4, Intel отменила поддержку FMA4 и вернулась к FMA3 в спецификации AVX / FMA версии 5 (см. История FMA).[1][5][6]
В марте 2015 года AMD явно указала в описании патча для пакета GNU Binutils, что Дзен, его архитектура x86-64 третьего поколения в первой итерации (znver1 - Zen, версия 1), не будет поддерживать инструкции TBM, FMA4, XOP и LWP, разработанные специально для семейства микроархитектур Bulldozer.[7][8]
Инструкции умножения-накопления целочисленных векторов
Это целочисленная версия Набор инструкций FMA. Это все четыре команды операнда, похожие на FMA4 и все они работают с целыми числами со знаком.
Инструкция | Описание[9] | Операция |
---|---|---|
VPMACSWW
| Умножение накопления (с насыщением) слова в слово | 2x8 слов (a0-a7, b0-b7) + 8 слов (c0-c7) → 8 слов (r0-r7) r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSWD
| Умножение накопления (с насыщением) младшего слова на двойное слово | 2x8 слов (a0-a7, b0-b7) + 4 двойных слова (c0-c3) → 4 двойных слова (r0-r3) r0 = a0 * b0 + c0, r1 = a2 * b2 + c1, .[2] |
VPMACSDD
| Умножение накопления (с насыщением) двойного слова на двойное слово | 2х4 двойных слова (a0-a3, b0-b3) + 4 двойных слова (c0-c3) → 4 двойных слова (r0-r3) r0 = a0 * b0 + c0, r1 = a1 * b1 + c1, .. |
VPMACSDQL
| Умножение накопления (с насыщением) младшего двойного слова на четверное слово | 2х4 двойных слова (a0-a3, b0-b3) + 2 четверных слова (c0-c1) → 2 четверных слова (r0-r3) r0 = a0 * b0 + c0, r1 = a2 * b2 + c1 |
VPMACSDQH
| Умножение накопления (с насыщением) высокого двойного слова на четверное слово | 2х4 двойных слова (a0-a3, b0-b3) + 2 четверных слова (c0-c1) → 2 четверных слова (r0-r3) r0 = a1 * b1 + c0, r1 = a3 * b3 + c1 |
VPMADCSWD
| Умножение Добавить Накапливаемое (с насыщением) слово в двойное слово | 2x8 слов (a0-a7, b0-b7) + 4 двойных слова (c0-c3) → 4 двойных слова (r0-r3) r0 = a0 * b0 + a1 * b1 + c0, r1 = a2 * b2 + a3 * b3 + c1, .. |
Горизонтальное сложение целочисленных векторов
Команды горизонтального сложения добавляют друг к другу соседние значения во входном векторе. Размер вывода в приведенных ниже инструкциях описывает ширину выполняемого горизонтального сложения. Например, горизонтальный байт к слову добавляет два байта за раз и возвращает результат как вектор слов, но байт к четверному слову складывает вместе восемь байтов за раз и возвращает результат как вектор четверных слов. Шесть дополнительных инструкций по горизонтальному сложению и вычитанию можно найти в SSSE3, но они работают с двумя входными векторами и выполняют только две и две операции.
Инструкция | Описание[9] | Операция |
---|---|---|
VPHADDBW
| По горизонтали добавить к слову два байта со знаком / без знака | 16 байт (a0-a15) → 8 слов (r0-r7) г0 = а0 + а1, г1 = а2 + а3, г2 = а4 + а5, ... |
VPHADDBD
| По горизонтали добавить четыре байта со знаком / без знака в двойное слово | 16 байт (a0-a15) → 4 двойных слова (r0-r3) г0 = а0 + а1 + а2 + а3, г1 = а4 + а5 + а6 + а7, ... |
VPHADDBQ
| По горизонтали добавить восемь подписанных / беззнаковых байтов к четверному слову | 16 байт (a0-a15) → 2 четверных слова (r0-r1) г0 = а0 + а1 + а2 + а3 + а4 + а5 + а6 + а7, ... |
VPHADDWD
| По горизонтали добавить два слова со знаком / без знака в двойное слово | 8 слов (a0-a7) → 4 двойных слова (r0-r3) г0 = а0 + а1, г1 = а2 + а3, г2 = а4 + а5, ... |
VPHADDWQ
| По горизонтали добавить четыре знаковых / беззнаковых слова в четверное слово | 8 слов (a0-a7) → 2 четверных слова (r0-r1) г0 = а0 + а1 + а2 + а3, г1 = а4 + а5 + а6 + а7 |
VPHADDDQ
| По горизонтали добавить два знаковых / беззнаковых двойных слова в четверное слово | 4 двойных слова (a0-a3) → 2 четверных слова (r0-r1) г0 = а0 + а1, г1 = а2 + а3 |
VPHSUBBW | Горизонтальное вычитание двух байтов со знаком до слова | 16 байт (a0-a15) → 8 слов (r0-r7) r0 = a0-a1, г1 = а2-а3, г2 = а4-а5, ... |
VPHSUBWD | Горизонтальное вычитание двух подписанных слов в двойное слово | 8 слов (a0-a7) → 4 двойных слова (r0-r3) г0 = а0-а1, г1 = а2-а3, г2 = а4-а5, ... |
VPHSUBDQ | Горизонтальное вычитание двух двойных слов со знаком в четверное слово | 4 двойных слова (a0-a3) → 2 четверных слова (r0-r1) r0 = a0-a1, г1 = а2-а3 |
Целочисленное сравнение векторов
Этот набор команд сравнения векторов принимает немедленный дополнительный аргумент. Непосредственно контролирует, какое сравнение выполняется. Для каждой инструкции возможно восемь сравнений. Векторы сравниваются, и все сравнения, которые оцениваются как истинные, устанавливают все соответствующие биты в адресате на 1, а ложные сравнения устанавливают все те же биты на 0. Этот результат можно использовать непосредственно в инструкции VPCMOV для векторизованного условный ход.
Инструкция | Описание[9] | Немедленный | Сравнение | |
---|---|---|---|---|
VPCOMB | Сравнить векторные подписанные байты | 000 | Меньше, чем | |
VPCOMW | Сравнить векторные подписанные слова | 001 | Меньше или равно | |
VPCOMD | Сравнить двойные слова с векторной подписью | 010 | Лучше чем | |
VPCOMQ | Сравнить четырехзначные слова со знаком | 011 | Больше или равно | |
VPCOMUB | Сравнить векторные беззнаковые байты | 100 | Равный | |
VPCOMUW | Сравнить векторные беззнаковые слова | 101 | Не равный | |
VPCOMUD | Сравнить векторные беззнаковые двойные слова | 110 | Ложь | |
VPCOMUQ | Сравнить векторные беззнаковые четырехслова | 111 | Истинный |
Векторный условный ход
VPCMOV работает как побитовый вариант инструкций смешивания в SSE4. Для каждого бита в селекторе 1 выбирает один и тот же бит в первом источнике, а 0 выбирает такой же во втором источнике. При использовании вместе с приведенными выше инструкциями по сравнению векторов XOP это можно использовать для реализации векторизованного троичного перемещения или, если второй вход совпадает с местом назначения, условным перемещением (CMOV).
Инструкция | Описание[9] |
---|---|
VPCMOV | Векторный условный ход |
Инструкции по сдвигу и повороту целочисленного вектора
Инструкции по смене здесь отличаются от приведенных здесь. SSE2 в том, что они могут сдвигать каждую единицу на разную величину, используя векторный регистр, интерпретируемый как упакованные целые числа со знаком. Знак указывает направление сдвига или поворота, при этом положительные значения вызывают сдвиг влево, а отрицательные - вправо.[10]Intel указала другой несовместимый набор инструкций переменного векторного сдвига в AVX2.[11]
Инструкция | Описание[9] |
---|---|
ВПРОТБ | Упакованные байты поворота |
VPROTW | Упакованные слова поворота |
ВПРОТД | Упакованные двойные слова поворота |
VPROTQ | Упакованное вращение четырех слов |
VPSHAB | Упакованные арифметические байты сдвига |
VPSHAW | Арифметические слова с упакованным сдвигом |
ВПШАД | Двойные арифметические слова со сдвигом |
VPSHAQ | Арифметические четырехслова с упакованным сдвигом |
ВПШЛБ | Логические байты упакованного сдвига |
VPSHLW | Логические слова упакованного сдвига |
VPSHLD | Логические двойные слова с упакованным сдвигом |
VPSHLQ | Логические четверные слова с упакованным сдвигом |
Вектор перестановка
VPPERM - это отдельная инструкция, которая объединяет SSSE3 инструкция PALIGNR и PSHUFB и добавляет больше к обоим. Некоторые сравнивают это Altivec инструкция ВПЕРМ.[12] В качестве входных данных он принимает три регистра, первые два - это регистры источника, а третий - регистр выбора. Каждый байт в селекторе выбирает один из байтов в одном из двух входных регистров для вывода. Селектор также может применять эффекты к выбранным байтам, такие как установка его на 0, изменение порядка следования битов и повторение самого значащего бита. Кроме того, все эффекты или вход можно инвертировать.
Инструкции VPERMIL2PD и VPERMIL2PS - это две исходные версии инструкций VPERMILPD и VPERMILPS в AVX что означает, что, как и VPPERM, они могут выбирать вывод из любого поля в двух входах.
Инструкция | Описание[9] |
---|---|
ВПЕРМ | Упакованный перестановочный байт |
VPERMIL2PD | Перестановка двух источников с плавающей запятой двойной точности |
VPERMIL2PS | Перестановка двух источников с плавающей запятой одинарной точности |
Извлечение фракции с плавающей запятой
Эти инструкции извлекают дробную часть с плавающей запятой, то есть ту часть, которая будет потеряна при преобразовании в целое число.
Инструкция | Описание[9] |
---|---|
VFRCZPD | Извлечение фракций с плавающей запятой двойной точности |
VFRCZPS | Извлечение фракций с плавающей запятой одинарной точности |
VFRCZSD | Извлечь фракцию Скалярная двойная точность с плавающей запятой |
VFRCZSS | Извлечь фракцию Скалярная числа с плавающей запятой одинарной точности |
Процессоры с XOP
- AMD:
- Переработчики "тяжелого оборудования"
- Бульдозерный процессоров, 4 квартал 2011 г.[13]
- Пиледривер на базе процессоров, 4 квартал 2012 г.[14]
- На базе парового катка процессоров, 1 квартал 2014 г.
- Экскаватор на базе процессоры (включая «v2»), 2015 г.
- Переработчики "тяжелого оборудования"
Смотрите также
Рекомендации
- ^ а б c d Дэйв Кристи (2007-05-07), Достижение баланса, Блоги разработчиков AMD, заархивированные с оригинал на 2013-11-04, получено 2013-11-04
- ^ а б Руководство программиста по архитектуре AMD64, том 6: 128-битные и 256-битные инструкции XOP, FMA4 и CVT16 (PDF), AMD, 1 мая 2009 г.
- ^ Майкл Ларабель (3 марта 2017 г.). «Влияние настройки компилятора GCC Zen на производительность AMD Ryzen». Фороникс.
Но поскольку Zen представляет собой дизайн с чистого листа, в процессорах Bulldozer есть некоторые расширения набора команд, которых нет в Zen / znver1. Те, кого больше нет, включают FMA4 и XOP.
- ^ Агнер Туман (5 декабря 2009 г.), Остановите войну набора инструкций
- ^ Справочник по программированию Intel AVX (PDF), Март 2008 г., получено 2012-01-17
- ^ Справочник по программированию Intel Advanced Vector Extensions, Январь 2009 г., архивировано из оригинал 29 февраля 2012 г., получено 2012-01-17
- ^ Ганеш Гопаласубраманян (10 марта 2015 г.). "[ПАТЧ] добавить процессор znver1". [email protected] (Список рассылки).
- ^ Амит Павар (7 августа 2015 г.). "[ПАТЧ] Удалить CpuFMA4 из флагов процессора Znver1". [email protected] (Список рассылки).
- ^ а б c d е ж грамм "Руководство программиста по архитектуре AMD64, том 4: 128-битные и 256-битные мультимедийные инструкции" (PDF). AMD. Получено 2014-01-13.
- ^ "Новые" Бульдозер "и" Пиледривер "Инструкции" (PDF). AMD. Получено 2014-01-13.
- ^ «Справочник по программированию расширений набора команд архитектуры Intel». Intel. Архивировано из оригинал (PDF) 1 февраля 2014 г.. Получено 2014-01-29.
- ^ "Оптимизация Buldozer x264". Получено 2014-01-13.
- ^ Дэйв Кристи (2007-05-07), Достижение баланса, Блоги разработчиков AMD, заархивированные с оригинал на 2013-11-09, получено 2012-01-17
- ^ Новые инструкции "Бульдозер" и "Пиледривер" (PDF), AMD, октябрь 2012 г.