SSE4
SSE4 — набор команд микроархитектуры Intel Core, впервые реализованный в процессорах серии Penryn (не следует путать с SSE4A от AMD)[1].
Он был анонсирован 27 сентября 2006 года, однако детальное описание стало доступно только весной 2007 года. Более подробное описание новых возможностей процессоров для программистов можно найти на сайте Intel.
Набор команд
[править | править код]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)[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-битное поле результата.
Проверки бит
[править | править код]- PTEST xmm1, xmm2/m128 — (Logical Compare)
Установить флаг ZF, если только в xmm2/m128 все би��ы помеченные маской из xmm1 равны нулю. Если все не помеченные биты равны нулю, то установить флаг CF. Остальные флаги (AF, OF, PF, SF) всегда сбрасываются. Инструкция не модифицирует 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)
Операция чтения, позволяющая ускорить (до 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]
Инструкция | Описание |
---|---|
LZCNT/POPCNT | Подсчет числа нулевых/единичных битов. |
EXTRQ/INSERTQ | Комбинированные инструкции маскирования и сдвига[5] |
MOVNTSD/MOVNTSS | Скалярные инструкции потоковой записи[6] |
Процессоры с поддержкой SSE4
[править | править код]Литература
[править | править код]- FAQ: Процессоры семейства Intel® Core™ 2 и инструкции Intel® SSE4 (рус.)
- iXBT.com 28 Сентября, 2006 IDF Fall`06: Intel готовит SSE4 в 2007-м
- iXBT.com 29 Марта, 2007 Презентация Intel Penryn (первое упоминание о Super Shuffle Engine)
- Описание 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 — GNU Project — Free Software Foundation (FSF) . Дата обращения: 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 года.