SSE4
SSE4 — набор команд микроархитектуры Intel Core, впервые реализованный в процессорах серии Penryn (не следует путать с SSE4A компании AMD)[1].
Набор был анонсирован 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 | PMULLD, PMULDQ | Новая поддержка четырех знаковых (и без знака) 32x32 битных умножений за одну инструкцию, так же как знаковые умножения вида 32x32->64. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran). |
| Скалярное произведение с плавающей точкой | DPPS, DPPD | Повышенная производительность обработки данных типа AOS (массив структур) посредством поддержки скалярных произведений с одинарной и двойной точностью. | Создание трехмерного контента, игр. Поддержка языков программирования, таких как CG и HLSL. |
| Упакованное сопряжение | BLENDPS, BLENDPD, BLENDVPS, BLENDVPD, PBLENDVB, PBLENDDW | Условно операция сопряжения копирует одно поле от источника и переносит его в место назначения. Эти новые процессорные команды повысят производительность операций сопряжения для большинства размеров полей, посредством упаковки операций умножения в единую инструкцию. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. Мультимедиа и игровые ресурсы. |
| Упакованные целочисленные максимальные и минимальные значения | PMINSB, PMAXSB, PMINUW, PMAXUW, PMINUD, PMAXUD, PMINDS, PMAXSD | Сравнивает упакованные знаковые/без знака на уровне байт/слов/двойных слов целочисленные значения в операнде назначения и в исходном операнде и возвращает минимальное или максимальное значение за одну инструкцию для каждого запакованного операнда в операнде назначения. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. |
| Округление значений с плавающей запятой | ROUNDPS, ROUNDSS, ROUNDPD, ROUNDSD | Эффективно округляет скаляр и упакованный операнд с одинарной или двойной точностью до целочисленного значения с поддержкой требований языков программирования Fortran, Java и C99. | Обработка изображений, графики, видеоинформации. Приложения с двухмерной/трехмерной мультимедиа и игровые ресурсы. |
| Вставка/извлечение регистров | INSERTPS, PINSRB, PINSRD, PINSRQ, EXTRACTPS, PEXTRB, PEXTRD, PEXTRW, PEXTRQ | Эти новые процессорные команды упрощают процесс вставки и извлечения между регистрами GPR (или памятью) и XMM. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. |
| Упакованное преобразование форматов | PMOVSXBW, PMOVZXBW, PMOVSXBD, PMOVZXBD, PMOVSXBQ, PMOVZXBQ, PMOVSXWD, PMOVZXWD, PMOVSXWQ, PMOVZXWQ, PMOVSXDQ, PMOVZXDQ | Преобразует упакованное целочисленное значение (из регистра XMM или памяти) в целочисленное значение более широкого типа со знаковым или нулевым расширением. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. |
| Упакованная проверка и установка | PTEST | Более быстрое ветвление архитектуры SIMD, осуществляемое для поддержки векторизированного кода. | Применимо для автоматизации компиляторной векторизации обработки данных, обработки изображений и видеоинформации, создания трехмерного контента. Мультимедиа и игровые ресурсы. |
| Упакованное определение идентичности | PCMPEQQ, PCMPGTQ | Архитектура SIMD определяет идентичность упакованных значений QWORDs в операнде назначения и в исходном операнде. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. Мультимедиа и игровые ресурсы. |
| Упаковка DWORD в беззнаковый формат WORD | PACKUSDW | Преобразует упакованный знаковый DWORD в упакованный формат WORD без знака посредством беззнакового сосредоточения для обработки условий переполнения. Эта новая процессорная команда завершает набор других команд в этом формате. | Широко применимо для автоматизации компиляторной векторизации обработки данных, написанных на языках программирования высокого уровня (таких как C и Fortran), а также для приложений, предназначенных для обработки изображений, видеоинформации. Мультимедиа и игровые ресурсы. |
| Улучшенные строковые операции | PCMPESTRI, PCMPESTRM, PCMPISTRI, PCMPISTRM | Эти новые процессорные команды содержат в себе большое количество возможностей обработки строк и текста, которые обычно требуют участия большего количества кодов операции. | Повышенная производительность для сканирования вирусов, поиска текста, строковой обработки библиотек, таких как ZLIB, базы данных, компиляторы и приложения, предназначенные для конечного автомата. |
Компилятор языка Си корпорации Intel, начиная с версии 10, генерирует инструкции SSE4 при задании опции -QxS. Компилятор Sun Studio Sun Microsystems с версии 12 update 1 генерирует инструкции SSE4 с помощью опций -xarch=sse4_1 (SSE4.1) и -xarch=sse4_2 (SSE4.2)[2]. Компилятор GCC поддерживает SSE4.1 и SSE4.2 с версии 4.3[3], опции -msse4.1 и -msse4.2, или -msse4, включающая оба варианта.
Изменения
Добавлены инструкции, ускоряющие компенсацию движения в видеокодеках, быстрое чтение из USWC-памяти, множество инструкций для упрощения векторизации программ компиляторами. Кроме того, в SSE4.2 добавлены инструкции обработки строк 8/16-битных символов, вычисления CRC32, POPCNT. Впервые в SSE4 регистр xmm0 стал использоваться как неявный аргумент для некоторых инструкций.
Новые инструкции SSE4.1
Ускорение видео
- MPSADBW xmm1, xmm2/m128, imm8 (Multiple Packed Sums of Absolute Difference)
- Input — { A0, A1,… A14 }, { B0, B1,… B15 }, Shiftmode
- Output — { SAD0, SAD1, SAD2,… SAD7 }. Вычисление восьми сумм абсолютных значений разностей (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 — { A0, A1,… A7 }
- Output — { MinVal, MinPos, 0, 0… }. Поиск среди 16-битных беззнаковых полей A0…A7 такого, который имеет минимальное значение (и позицию с меньшим номером, если таких полей несколько). Возвращается 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 — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
- Output — { A0*B0, A2*B2 }. Перемножение 32-битных полей со знаком с выдачей полных 64 бит результата (две операции умножения над 0 и 2 полями аргументов).
- PMULLD xmm1, xmm2/m128 (Multiply Packed Signed Dword Integers and Store Low Result)
- Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
- Output — { low32(A0*B0), low32(A1*B1), low32(A2*B2), low32(A3*B3) }. Перемножение 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-битное поле результата.
Проверки бит
Округления
- 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). Операция чтения, позволяющая ускорить до 7,5 раз работу с write-combining-областями памяти.
Новые инструкции 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 (другие обозначения CRC-32/ISCSI; CRC-32/CASTAGNOLI) для 8, 16, 32 или 64-битного аргумента (используется полином 0x1EDC6F41).
Подсчет популяции единичных битов
- 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][4]. Включает следующие инструкции:
Процессоры с поддержкой SSE4
Примечания
- ↑ Инновационный набор команд Streaming SIMD Extensions 4 (SSE4). Дата обращения: 21 февраля 2010. Архивировано из оригинала 29 мая 2010 года.
- ↑ Sun Studio 12 Update 1: C Compiler 5.10 Readme. Дата обращения: 8 февраля 2010. Архивировано 7 ноября 2009 года.
- ↑ GCC 4.3 Release Series — Changes, New Features, and Fixes. Дата обращения: 27 мая 2010. Архивировано 9 мая 2012 года.
- ↑ AMD CPUID Specification. Дата обращения: 7 мая 2011. Архивировано 16 мая 2011 года.
- ↑ Rahul Chaturvedi. “Barcelona” Processor Feature: SSE4a Instruction Set (англ.) (17 сентября 2007). Архивировано из оригинала 25 октября 2013 года.
- ↑ Rahul Chaturvedi. “Barcelona” Processor Feature: SSE4a, part 2 (англ.) (2 октября 2007). Архивировано из оригинала 25 октября 2013 года.