SSE4 - SSE4

SSE4 ( Streaming SIMD Extensions 4 ) - это набор инструкций ЦП SIMD, используемый в микроархитектуре Intel Core и AMD K10 (K8L) . Об этом было объявлено 27 сентября 2006 г. на Форуме разработчиков Intel осенью 2006 г. , а нечеткие детали были изложены в официальном документе ; более точные подробности 47 инструкций стали доступны в презентации на форуме разработчиков Intel весной 2007 года в Пекине . SSE4 полностью совместим с программным обеспечением, написанным для предыдущих поколений микропроцессоров с архитектурой Intel 64 и IA-32. Все существующее программное обеспечение продолжает работать правильно без изменений на микропроцессорах, которые включают SSE4, а также при наличии существующих и новых приложений, которые включают SSE4.

Подмножества SSE4

Intel SSE4 состоит из 54 инструкций. Подмножество, состоящее из 47 инструкций, именуемое SSE4.1 в некоторой документации Intel, доступно в Penryn . Кроме того, SSE4.2 , второе подмножество , состоящее из 7 оставшихся инструкций, является первым доступным в Nehalem основанного Core i7 . Intel считает, что отзывы разработчиков сыграли важную роль в разработке набора инструкций.

Начиная с процессоров на базе Barcelona , AMD представила набор инструкций SSE4a , который имеет 4 инструкции SSE4 и 4 новые инструкции SSE. Этих инструкций нет в процессорах Intel, поддерживающих SSE4.1, а процессоры AMD только начали поддерживать Intel SSE4.1 и SSE4.2 (полный набор инструкций SSE4) в процессорах FX на базе Bulldozer . В SSE4a также была введена функция несовпадения SSE, что означало, что невыровненные инструкции загрузки выполнялись так же быстро, как выровненные версии на выровненных адресах. Это также позволило отключить проверку выравнивания при доступе к памяти ненагруженных операций SSE. Позже Intel представила аналогичные улучшения скорости невыровненного SSE в своих процессорах Nehalem, но не вводила несогласованный доступ с помощью ненагруженных инструкций SSE до AVX .

Путаница в названии

То, что сейчас известно как SSSE3 (Supplemental Streaming SIMD Extensions 3), представленное в линейке процессоров Intel Core 2 , называлось SSE4 в некоторых СМИ, пока Intel не придумала прозвище SSSE3. Компания Intel, получившая внутреннее название Merom New Instructions, изначально не планировала давать им особое название, что подверглось критике со стороны некоторых журналистов. В конце концов Intel разрешила путаницу и зарезервировала имя SSE4 для своего следующего расширения набора инструкций.

Intel использует маркетинговый термин HD Boost для обозначения SSE4.

Новые инструкции

В отличие от всех предыдущих итераций SSE, SSE4 содержит инструкции, выполняющие операции, не относящиеся к мультимедийным приложениям. Он содержит ряд инструкций, действие которых определяется постоянным полем, и набор инструкций, которые принимают XMM0 в качестве неявного третьего операнда.

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

SSE4.1

Эти инструкции были представлены с помощью микроархитектуры Penryn , 45-нм усадки микроархитектуры Intel Core . Поддержка указывается с помощью флага CPUID.01H: ECX.SSE41 [Bit 19].

Инструкция Описание
MPSADBW
Вычислить восемь сумм смещений абсолютных разностей, по четыре за раз (т. Е. | X 0 −y 0 | + | x 1 −y 1 | + | x 2 −y 2 | + | x 3 −y 3 |, | x 0 −y 1 | + | x 1 −y 2 | + | x 2 −y 3 | + | x 3 −y 4 |, ..., | x 0 −y 7 | + | x 1 −y 8 | + | х 2 -y 9 | + | х 3 -y 10 |); эта операция важна для некоторых кодеков HD и позволяет вычислить разницу блоков 8 × 8 менее чем за семь циклов. Один бит трехбитового непосредственного операнда указывает, следует ли использовать y 0 .. y 10 или y 4 .. y 14 из операнда-адресата, два других - x 0 .. x 3 , x 4 .. x 7 , x 8 ..x 11 или x 12 ..x 15 следует использовать из источника.
PHMINPOSUW
Устанавливает нижнее 16-разрядное слово без знака места назначения равным наименьшему 16-битному слову без знака в источнике, а следующее снизу - к индексу этого слова в источнике.
PMULDQ
Упакованное 32-битное «длинное» умножение со знаком, умножение двух (1-го и 3-го) из четырех упакованных целых чисел дает два упакованных 64-битных результата.
PMULLD
Упакованное 32-битное «младшее» умножение со знаком, четыре упакованных набора целых чисел, умноженные на четыре упакованных 32-битных результата.
DPPS, DPPD
Точечный продукт для данных AOS (массив структур). Это требует немедленного операнда, состоящего из четырех (или двух для DPPD) битов, чтобы выбрать, какие из входных данных нужно умножать и накапливать, и еще четыре (или два для DPPD), чтобы выбрать, следует ли помещать 0 или скалярное произведение в соответствующее поле вывода.
BLENDPS, BLENDPD, BLENDVPS,
BLENDVPD, PBLENDVB, PBLENDW
Условное копирование элементов из одного места в другое, основанное (для не-V-формы) на битах в непосредственном операнде и (для V-формы) на битах в регистре XMM0.
PMINSB, PMAXSB, PMINUW, 
PMAXUW, PMINUD, PMAXUD, 
PMINSD, PMAXSD
Упакованный минимум / максимум для разных типов целочисленных операндов
ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD
Округление значений в регистре с плавающей запятой до целых чисел с использованием одного из четырех режимов округления, указанных в непосредственном операнде.
INSERTPS, PINSRB, PINSRD/PINSRQ,
EXTRACTPS, PEXTRB, PEXTRD/PEXTRQ
Команды INSERTPS и PINSR считывают 8, 16 или 32 бита из регистра x86 или ячейки памяти и вставляют их в поле регистра назначения, заданное непосредственным операндом. EXTRACTPS и PEXTR считывают поле из исходного регистра и вставляют его в регистр x86 или ячейку памяти. Например, PEXTRD eax, [xmm0], 1; EXTRACTPS [addr + 4 * eax], xmm1, 1 сохраняет первое поле xmm1 в адресе, заданном первым полем xmm0.
PMOVSXBW, PMOVZXBW, PMOVSXBD, 
PMOVZXBD, PMOVSXBQ, PMOVZXBQ, 
PMOVSXWD, PMOVZXWD, PMOVSXWQ, 
PMOVZXWQ, PMOVSXDQ, PMOVZXDQ
Упакованный знак / нулевое расширение для более широких типов
PTEST
Это похоже на инструкцию TEST в том, что она устанавливает флаг Z равным результату И между его операндами: ZF устанавливается, если DEST AND SRC равно 0. Кроме того, он устанавливает флаг C, если (NOT DEST) AND SRC равен нулю.

Это эквивалентно установке флага Z, если ни один из битов, замаскированных SRC, не установлен, и флага C, если установлены все биты, замаскированные SRC.

PCMPEQQ
Quadword (64 бита) сравнить на равенство
PACKUSDW
Преобразуйте подписанные DWORD в беззнаковые WORD с насыщением.
MOVNTDQA
Эффективное чтение из области памяти с комбинированием записи в регистр SSE; это полезно для получения результатов от периферийных устройств, подключенных к шине памяти.

SSE4.2

SSE4.2 добавил STTNI (String and Text New Instructions), несколько новых инструкций, которые выполняют поиск символов и сравнение двух операндов по 16 байт одновременно. Они были разработаны (среди прочего) для ускорения анализа XML- документов. Он также добавил инструкцию CRC32 для вычисления циклических проверок избыточности, используемых в определенных протоколах передачи данных. Эти инструкции были впервые реализованы в NehalemIntel Core i7 продуктовой линейки и завершить набор инструкций SSE4. Поддержка указывается с помощью флага CPUID.01H: ECX.SSE42 [Bit 20].

Инструкция Описание
CRC32
Накопите значение CRC32 C, используя полином 0x11EDC6F41 (или, без старшего бита, 0x1EDC6F41).
PCMPESTRI
Упакованное сравнение строк с явной длиной, индекс возврата
PCMPESTRM
Упакованные строки сравнения явной длины, маска возврата
PCMPISTRI
Упакованные строки сравнения неявной длины, индекс возврата
PCMPISTRM
Упакованные строки сравнения неявной длины, маска возврата
PCMPGTQ
Сравнить упакованные подписанные 64-битные данные для большего, чем

POPCNT и LZCNT

Эти инструкции работают с целыми числами, а не с регистрами SSE, потому что они не являются инструкциями SIMD, но появляются одновременно, и, хотя они были введены AMD с набором инструкций SSE4a, они считаются отдельными расширениями со своими собственными выделенными битами CPUID для обозначения поддержки. Intel внедряет POPCNT, начиная с микроархитектуры Nehalem, и LZCNT, начиная с микроархитектуры Haswell . AMD реализует и то, и другое, начиная с микроархитектуры Барселоны .

AMD называет эту пару инструкций Advanced Bit Manipulation (ABM) .

Инструкция Описание
POPCNT
Счетчик заполнения (количество битов, равное 1). Поддержка указывается с помощью флага CPUID.01H: ECX.POPCNT [Bit 23].
LZCNT
Ведущий нулевой счет . Поддержка указывается с помощью флага CPUID.80000001H: ECX.ABM [Bit 5].

Кодирование lzcnt достаточно похоже на bsr (обратное сканирование битов), что, если lzcnt выполняется на ЦП, не поддерживающем его, например на ЦП Intel до Haswell, он будет выполнять операцию bsr вместо того, чтобы вызывать ошибку недопустимой инструкции, несмотря на другой результат. значения lzcnt и bsr .

Завершающие нули можно подсчитать с помощью инструкций bsf (перемотка вперед) или tzcnt .

SSE4a

Группа инструкций SSE4a была представлена ​​в микроархитектуре AMD в Барселоне . Эти инструкции недоступны для процессоров Intel. Поддержка указывается с помощью флага CPUID.80000001H: ECX.SSE4A [Bit 6].

Инструкция Описание
EXTRQ/INSERTQ
Комбинированные инструкции по сдвигу маски.
MOVNTSD/MOVNTSS
Инструкции по скалярному потоковому хранилищу.

Поддерживающие процессоры

  • Intel
    • Процессоры Silvermont (поддерживаются SSE4.1, SSE4.2 и POPCNT)
    • Процессоры Goldmont (поддерживаются SSE4.1, SSE4.2 и POPCNT)
    • Процессоры Goldmont Plus (поддерживаются SSE4.1, SSE4.2 и POPCNT)
    • Процессоры Tremont (поддерживаются SSE4.1, SSE4.2 и POPCNT)
    • Процессоры Penryn (поддерживается SSE4.1, кроме Pentium Dual-Core и Celeron )
    • Процессоры Nehalem и Westmere (поддерживаются SSE4.1, SSE4.2 и POPCNT, кроме Pentium и Celeron )
    • Процессоры Sandy Bridge и новее (поддерживаются SSE4.1, SSE4.2 и POPCNT, включая Pentium и Celeron )
    • Процессоры Haswell и новее (поддерживаются SSE4.1, SSE4.2, POPCNT и LZCNT)
  • AMD
  • С ПОМОЩЬЮ
    • Процессоры Nano 3000, X2, QuadCore (с поддержкой SSE4.1)
    • Процессоры Nano QuadCore серии C4000 (с поддержкой SSE4.1, SSE4.2)
    • Процессоры Eden X4 (поддерживаются SSE4.1, SSE4.2)
  • Чжаосин
    • Процессоры ZX-C и новее (поддерживаются SSE4.1, SSE4.2)

использованная литература

внешние ссылки