Interested Article - SSE4
- 2021-09-25
- 1
SSE4 — набор команд микроархитектуры Intel Core , впервые реализованный в процессорах серии Penryn (не следует путать с SSE4A от AMD) .
Он был анонсирован 27 сентября 2006 года , однако детальное описание стало доступно только весной 2007 года . Более подробное описание новых возможностей процессоров для программистов можно найти
Набор команд
SSE4 состоит из 54 инструкций, 47 из них относят к SSE4.1 (они есть в процессорах Penryn). Полный набор команд (SSE4.1 и SSE4.2, то есть 47 + оставшиеся 7 команд) доступен в процессорах Intel с микроархитектурой Nehalem, которые были выпущены в середине ноября 2008 года и более поздних редакциях. Ни одна из SSE4 инструкций не работает с 64-битными mmx регистрами (только со 128-битными xmm0-15).
Подгруппа | Процессорные команды | Описание | Ожидаемые улучшения в работе приложения |
---|---|---|---|
Различные упакованные операции DWORD |
|
Новая поддержка четырех знаковых (и без знака) 32x32 битных умножений за одну инструкцию, так же как знаковые умножения вида 32x32->64. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran). |
Скалярное произведение с плавающей точкой |
|
Повышенная производительность обработки данных типа AOS (массив структур) посредством поддержки скалярных произведений с одинарной и двойной точностью. | Создание трехмерного контента, игр. Поддержка языков программирования, таких как CG и HLSL. |
Упакованное сопряжение |
|
Условно операция сопряжения копирует одно поле от источника и переносит его в место назначения. Эти новые процессорные команды повысят производительность операций сопряжения для большинства размеров полей, посредством упаковки операций умножения в единую инструкцию. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. Мультимедиа и игровые ресурсы. |
Упакованные целочисленные максимальные и минимальные значения |
|
Сравнивает упакованные знаковые/без знака на уровне байт/слов/двойных слов целочисленные значения в операнде назначения и в исходном операнде и возвращает минимальное или максимальное значение за одну инструкцию для каждого запакованного операнда в операнде назначения. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. |
Округление значений с плавающей запятой |
|
Эффективно округляет скаляр и упакованный операнд с одинарной или двойной точностью до целочисленного значения с поддержкой требований языков программирования Fortran, Java и C99. | Обработка изображений, графики, видеоинформации. Приложения с двухмерной/трехмерной мультимедиа и игровые ресурсы. |
Вставка/извлечение регистров |
|
Эти новые процессорные команды упрощают процесс вставки и извлечения между регистрами GPR (или памятью) и XMM. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. |
Упакованное преобразование форматов |
|
Преобразует упакованное целочисленное значение (из регистра XMM или памяти) в целочисленное значение более широкого типа со знаковым или нулевым расширением. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. |
Упакованная проверка и установка |
|
Более быстрое ветвление архитектуры SIMD, осуществляемое для поддержки векторизированного кода. | Применимо для автоматизации компиляторной векторизации обработки данных, обработки изображений и видеоинформации, создания трехмерного контента. Мультимедиа и игровые ресурсы. |
Упакованное определение идентичности |
|
Архитектура SIMD определяет идентичность упакованных значений QWORDs в операнде назначения и в исходном операнде. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. Мультимедиа и игровые ресурсы. |
Упаковка DWORD в беззнаковый формат WORD |
|
Преобразует упакованный знаковый DWORD в упакованный формат WORD без знака посредством беззнакового сосредоточения для обработки условий переполнения. Эта новая процессорная команда завершает набор других команд в этом формате. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. Мультимедиа и игровые ресурсы. |
Улучшенные строковые операции |
|
Эти новые процессорные команды содержат в себе большое количество возможностей обработки строк и текста, которые обычно требуют участия большего количества кодов операции. | Повышенная производительность для сканирования вирусов, поиска текста, строковой обработки библиотек, таких как ZLIB, базы данных, компиляторы и приложения, предназначенные для конечного автомата. |
Компилятор
языка
Си
от Intel начиная с версии 10 генерирует инструкции SSE4 при задании опции
-QxS
. Компилятор
Sun Studio
от
Sun Microsystems
с версии 12 update 1 генерирует инструкции SSE4 с помощью опций
-xarch=sse4_1
(SSE4.1) и
-xarch=sse4_2
(SSE4.2)
. Компилятор
GCC
поддерживает SSE4.1 и SSE4.2 с версии 4.3
, опции
-msse4.1
и
-msse4.2
, или
-msse4
, включающая оба варианта.
Изменения
Добавлены инструкции, ускоряющие в видеокодеках , быстрое памяти, множество инструкций для упрощения векторизации программ компиляторами.
Кроме того, в SSE4.2 добавлены инструкции обработки строк 8/16-битных символов, вычисления CRC32, POPCNT . Впервые в SSE4 регистр xmm0 стал использоваться как неявный аргумент для некоторых инструкций.
Новые инструкции SSE4.1
Ускорение видео
-
MPSADBW
xmm1, xmm2/m128, imm8 —
(Multiple Packed Sums of Absolute Difference)
- Input — { A 0 , A 1 ,… A 14 }, { B 0 , B 1 ,… B 15 }, Shiftmode
- Output — { SAD 0 , SAD 1 , SAD 2 ,… SAD 7 }
Вычисление восьми сумм абсолютных значений разностей (SAD) смещённых 4-байтных беззнаковых групп. Расположение операндов для 16-битных SAD определяется тремя битами непосредственного аргумента imm8.
s1 = imm8[2]*4 s2 = imm8[1:0]*4 SAD0 = |A(s1+0)-B(s2+0)| + |A(s1+1)-B(s2+1)| + |A(s1+2)-B(s2+2)| + |A(s1+3)-B(s2+3)| SAD1 = |A(s1+1)-B(s2+0)| + |A(s1+2)-B(s2+1)| + |A(s1+3)-B(s2+2)| + |A(s1+4)-B(s2+3)| SAD2 = |A(s1+2)-B(s2+0)| + |A(s1+3)-B(s2+1)| + |A(s1+4)-B(s2+2)| + |A(s1+5)-B(s2+3)| ... SAD7 = |A(s1+7)-B(s2+0)| + |A(s1+8)-B(s2+1)| + |A(s1+9)-B(s2+2)| + |A(s1+10)-B(s2+3)|
-
PHMINPOSUW
xmm1, xmm2/m128 —
(Packed Horizontal Word Minimum)
- Input — { A 0 , A 1 ,… A 7 }
- Output — { MinVal, MinPos, 0, 0… }
Поиск среди 16-битных беззнаковых полей A 0 …A 7 такого, который имеет минимальное значение (и позицию с меньшим номером, если таких полей несколько). Возвращается 16-битное значение и его позиция.
- PMOV{SX,ZX}{B,W,D} xmm1, xmm2/m{64,32,16} — (Packed Move with Sign/Zero Extend)
Группа из 12-и инструкций для расширения формата упакованных полей. Упакованные 8, 16, или 32-битные поля из младшей части аргумента расширяются (со знаком или без) в 16, 32 или 64-битные поля результата.
Входной формат |
Результирующий
формат |
||
---|---|---|---|
8 бит | 16 бит | 32 бита | |
PMOVSXBW | 16 бит | ||
PMOVZXBW | PMOVZXWW | ||
PMOVSXBD | PMOVSXWD | 32 бита | |
PMOVZXBD | PMOVZXWD | PMOVSXDD | |
PMOVSXBQ | PMOVSXWQ | PMOVSXDQ | 64 бита |
PMOVZXBQ | PMOVZXWQ | PMOVZXDQ |
Векторные примитивы
- P{MIN,MAX}{SB,UW,SD,UD} xmm1, xmm2/m128 — (Minimum/Maximum of Packed Signed/Unsigned Byte/Word/DWord Integers)
Каждое поле результата есть минимальное/максимальное значение соответствующих полей двух аргументов. Байтовые поля рассматриваются только как числа со знаком, 16-битные — только как числа без знака. Для 32-битных упакованных полей предусмотрен вариант как со знаком, так и без.
-
PMULDQ
xmm1, xmm2/m128 —
(Multiply Packed Signed Dword Integers)
- Input — { A 0 , A 1 , A 2 , A 3 }, { B 0 , B 1 , B 2 , B 3 }
- Output — { A 0 *B 0 , A 2 *B 2 }
Перемножение 32-битных полей со знаком с выдачей полных 64 бит результата (две операции умножения над 0 и 2 полями аргументов).
-
PMULLD
xmm1, xmm2/m128 —
(Multiply Packed Signed Dword Integers and Store Low Result)
- Input — { A 0 , A 1 , A 2 , A 3 }, { B 0 , B 1 , B 2 , B 3 }
- Output — { low32(A 0 *B 0 ), low32(A 1 *B 1 ), low32(A 2 *B 2 ), low32(A 3 *B 3 ) }
Перемножение 32-битных полей со знаком с выдачей младших 32 бит результатов (четыре операции умножения над всеми полями аргументов).
- PACKUSDW xmm1, xmm2/m128 — (Pack with Unsigned Saturation)
Упаковка 32-битных полей со знаком в 16-битные поля без знака с насыщением.
- PCMPEQQ xmm1, xmm2/m128 — (Compare Packed Qword Data for Equal)
Проверка 64-битных полей на равенство и выдача 64-битных масок.
Вставки/извлечения
- INSERTPS xmm1, xmm2/m32, imm8 — (Insert Packed Single Precision Floating-Point Value)
Вставка 32-битного поля из xmm2 (возможно выбрать любой из 4 полей этого регистра) или из 32-битной ячейки памяти в произвольное поле результата. Кроме того, для каждого из полей результата можно задать сброс его в +0.0.
- EXTRACTPS r/m32, xmm, imm8 — (Extract Packed Single Precision Floating-Point Value)
Извлечение 32-битного поля из xmm регистра, номер поля указывается в младших 2 битах imm8. Если в качестве результата указан 64-битный регистр, то его старшие 32 бита сбрасываются (расширение без знака).
- PINSR{B,D,Q} xmm, r/m*, imm8 — (Insert Byte/Dword/Qword)
Вставка 8, 32, или 64-битного значения в указанное поле xmm регистра (остальные поля не изменяются).
- PEXTR{B,W,D,Q} r/m*, xmm, imm8 — (Extract Byte/Word/Dword/Qword)
Извлечение 8, 16, 32, 64-битного поля из указанного в imm8 поля xmm регистра. Если в качестве результата указан регистр, то его старшая часть сбрасывается (расширение без знака).
Скалярное умножение векторов
- DPPS xmm1, xmm2/m128, imm8 — (Dot Product of Packed Single Precision Floating-Point Values)
- DPPD xmm1, xmm2/m128, imm8 — (Dot Product of Packed Double Precision Floating-Point Values)
Скалярное умножение векторов (dot product) 32/64-битных полей. Посредством битовой маски в imm8 указывается, какие произведения полей должны суммироваться и что следует прописать в каждое поле результата: сумму указанных произведений или +0.0.
Смешивания
- BLENDV{PS,PD} xmm1, xmm2/m128, <xmm0> — (Variable Blend Packed Single/Double Precision Floating-Point Values)
Выбор каждого 32/64-битного поля результата осуществляется в зависимости от знака такого же поля в неявном аргументе xmm0: либо из первого, либо из второго аргумента.
- BLEND{PS,PD} xmm1, xmm2/m128, imm8 — (Blend Packed Single/Double Precision Floating-Point Values)
Битовая маска (4 или 2 бита) в imm8 указывает из какого аргумента следует взять каждое 32/64-битное поле результата.
- PBLENDVB xmm1, xmm2/m128, <xmm0> — (Variable Blend Packed Bytes)
Выбор каждого байтового поля результата осуществляется в зависимости от знака байта такого же поля в неявном аргументе xmm0: либо из первого, либо из второго аргумента.
- PBLENDW xmm1, xmm2/m128, imm8 — (Blend Packed Words)
Битовая маска (8 бит) в imm8 указывает из какого аргумента следует взять каждое 16-битное поле результата.
Проверки бит
- PTEST xmm1, xmm2/m128 — (Logical Compare)
Установить флаг , если только в xmm2/m128 все биты помеченные маской из xmm1 равны нулю. Если все не помеченные биты равны нулю, то установить флаг CF . Остальные флаги ( , OF , , ) всегда сбрасываются. Инструкция не модифицирует xmm1.
Округления
- ROUND{PS, PD} xmm1, xmm2/m128, imm8 — (Round Packed Single/Double Precision Floating-Point Values)
Округление всех 32/64-битных полей. Режим округления (4 варианта) выбирается либо из MXCSR.RC, либо задаётся непосредственно в imm8. Также можно подавить генерацию исключения потери точности.
- ROUND{SS, SD} xmm1, xmm2/m128, imm8 — (Round Scalar Single/Double Precision Floating-Point Values)
Округление только младшего 32/64-битного поля (остальные биты остаются неизменными).
Чтение WC памяти
- MOVNTDQA xmm1, m128 — (Load Double Quadword Non-Temporal Aligned Hint)
Операция чтения, позволяющая ускорить работу с областями памяти.
Новые инструкции SSE4.2
Обработка строк
Эти инструкции выполняют арифметические сравнения между всеми возможными парами полей (64 или 256 сравнений) из обеих строк, заданных содержимым xmm1 и xmm2/m128. Затем булевые результаты сравнений обрабатываются для получения нужных результатов. Непосредственный аргумент imm8 управляет размером (байтовые или unicode строки, до 16/8 элементов каждая), знаковостью полей (элементов строк), типом сравнения и интерпретацией результатов.
Ими можно производить в строке (области памяти) поиск символов из заданного набора или в заданных диапазонах. Можно сравнивать строки (области памяти) или производить поиск подстрок.
Все они оказывают влияние на флаги процессора: SF устанавливается если в xmm1 не полная строка, ZF — если в xmm2/m128 не полная строка, CF — если результат не нулевой, OF — если младший бит результата не нулевой. Флаги AF и PF сбрасываются.
- PCMPESTRI <ecx>, xmm1, xmm2/m128, <eax>, <edx>, imm8 — ()
Явное задание размера строк в <eax>, <edx> (берётся абсолютная величина регистров с насыщение до 8/16, в зависимости от размера элементов строк. Результат в регистре ecx.
- PCMPESTRM <xmm0>, xmm1, xmm2/m128, <eax>, <edx>, imm8 — ()
Явное задание размера строк в <eax>, <edx> (берётся абсолютная величина регистров с насыщение до 8/16, в зависимости от размера элементов строк. Результат в регистре xmm0.
- PCMPISTRI <ecx>, xmm1, xmm2/m128, imm8 — ()
Неявное задание размера строк (производится поиск нулевых элементов к каждой из строк). Результат в регистре ecx.
- PCMPISTRM <xmm0>, xmm1, xmm2/m128, imm8 — ()
Неявное задание размера строк (производится поиск нулевых элементов к каждой из строк). Результат в регистре xmm0.
Подсчет CRC32
- CRC32 r32, r/m* — (Подсчет CRC32)
Накопление значения CRC-32C (другие обозначения ) для 8, 16, 32 или 64-битного аргумента (используется полином ).
Подсчет популяции единичных битов
- POPCNT r, r/m* — (Return the Count of Number of Bits Set to 1)
Подсчет числа единичных битов. Три варианта инструкции: для 16, 32 и 64-битных регистров. Также присутствует в SSE4A от AMD.
Векторные примитивы
- PCMPGTQ xmm1, xmm2/m128 — (Compare Packed Qword Data for Greater Than)
Проверка 64-битных полей на «больше чем» и выдача 64-битных масок.
SSE4a
Набор инструкций SSE4a был введен компанией AMD в процессоры на архитектуре Barcelona . Это расширение не доступно в процессорах Intel. Поддержка определяется через CPUID.80000001H:ECX.SSE4A[Bit 6] флаг.
Инструкция | Описание |
---|---|
LZCNT/POPCNT | Подсчет числа нулевых/единичных битов. |
EXTRQ/INSERTQ | Комбинированные инструкции маскирования и сдвига |
MOVNTSD/MOVNTSS | Скалярные инструкции потоковой записи |
Процессоры с поддержкой SSE4
Литература
- FAQ: (рус.)
- iXBT.com 28 Сентября, 2006
- iXBT.com 29 Марта, 2007 (первое упоминание о )
Примечания
- . Дата обращения: 21 февраля 2010. Архивировано из 29 мая 2010 года.
- . Дата обращения: 8 февраля 2010. 7 ноября 2009 года.
- . Дата обращения: 27 мая 2010. 9 мая 2012 года.
- . Дата обращения: 7 мая 2011. 16 мая 2011 года.
- Rahul Chaturvedi. (англ.) (17 сентября 2007). Архивировано из 25 октября 2013 года.
- Rahul Chaturvedi. (англ.) (2 октября 2007). Архивировано из 25 октября 2013 года.
- 2021-09-25
- 1