SSE
[править]
Материал из Википедии — свободной энциклопедии
SSE (англ. Streaming SIMD Extensions, потоковое SIMD-расширение процессора) — это SIMD (англ. Single Instruction, Multiple Data, Одна инструкция — множество данных) набор инструкций, разработанный Intel и впервые представленный в процессорах серии Pentium III как ответ на аналогичный набор инструкций 3DNow! от AMD, который был представлен годом раньше. Первоначально названием этих инструкций было KNI, что расшифровывалось как Katmai New Instructions (Katmai — название первой версии ядра процессора Pentium III).
Технология SSE позволяла преодолеть 2 основные проблемы MMX — при использовании MMX невозможно было одновременно использовать инструкции сопроцессора, так как его регистры использовались для MMX и работы с вещественными числами.
SSE включает в архитектуру процессора восемь 128-битных регистров (xmm0 до xmm7), каждый из которых трактуется как 4 последовательных значения с плавающей точкой одинарной точности. SSE включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных.
Преимущество в производительности достигается в том случае, когда необходимо произвести одну и ту же последовательность действий над разными данными.
Реализация блоков SIMD осуществляется распараллеливанием вычислительного процесса между данными, то есть, когда через один блок проходит поочерёдно множество потоков данных.Содержание [убрать]
1 Новое в SSE
2 Регистры
3 SSE-команды
4 Пример
5 См. также
6 Внешние ссылки
[править]
Новое в SSE
Восемь 128-битных регистров XMM.
32-битный MXCSR регистр флагов.
128-битный запакованный одинарной точности с плавающей точкой тип данных (т. е. 4 числа с плавающей точкой).
Инструкции над вещественными числами одинарной точности, а также расширился набор SIMD операции над целыми числами.
Инструкции чтобы сохранять и загружать состояние регистра MXCSR.
Инструкции явной предвыборки данных, контроля кэширования данных и контроля порядка операций сохранения.
Расширения инструкции CPUID. Используется для получения информации о процессоре. С её помощью программа может определить тип центрального процессора и его возможности (например, какие расширения поддерживаются процессором).
[править]
Регистры
В SSE добавлены восемь 128-битных регистров, которые называются xmm0..xmm7.
Каждый регистр может содержать:
Четыре 32-битных значений с плавающей точкой одинарной точности
Два 64-битных значения с плавающей точкой двойной точности
Два 64-битных целых числа
Четыре 32-битных целых числа
Восемь 16-битных целых чисел
Шестнадцать 8-битных целых чисел или символов
[править]
SSE-команды
Команды над числами с плавающей точкой
Команды пересылки
Скалярные типы – MOVSS
Упакованные типы – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
Арифметические команды
Скалярные типы – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
Упакованные типы – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
Команды сравнения
Скалярные типы – CMPSS, COMISS, UCOMISS
Упакованные типы – CMPPS
Перемешивание и распаковка
Упакованные типы – SHUFPS, UNPCKHPS, UNPCKLPS
Команды для преобразования типов
Скалярные типы – CVTSI2SS, CVTSS2SI, CVTTSS2SI
Упакованные типы – CVTPI2PS, CVTPS2PI, CVTTPS2PI
Битовые логические операции
Упакованные типы – ANDPS, ORPS, XORPS, ANDNPS
Команды над целых чисел
Арифметические команды
PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
Команды пересылки
PEXTRW, PINSRW
Другие
PMOVMSKB, PSHUFW
Другие команды
MXCSR-управление
LDMXCSR, STMXCSR
Управление Кешом и памятью
MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
[править]
Пример
Следующий пример демонстрирует перемножение четырёх пар чисел с плавающей точкой одной инструкцией mulps: (Программа написана на языке ANSI C++ с использованием ассемблерной вставки __asm и инструкций ассемблера для работы с SSE)
float a[4] = { 300.0, 4.0, 4.0, 12.0 };
float b[4] = { 1.5, 2.5, 3.5, 4.5 };
__asm {
movups xmm0, a ; // поместить 4 переменные с плавающей точкой из a в регистр xmm0
movups xmm1, b ; // поместить 4 переменные с плавающей точкой из b в регистр xmm1
mulps xmm1, xmm0 ; // перемножить пакеты плавающих точек: xmm1=xmm1*xmm0
; // xmm10 = xmm10*xmm00
; // xmm11 = xmm11*xmm01
; // xmm12 = xmm12*xmm02
; // xmm13 = xmm13*xmm03
movups a, xmm1 ; // выгрузить результаты из регистра xmm1 по адресам a
};
Материал из Википедии — свободной энциклопедии
3DNow! — дополнительное расширение MMX для процессоров AMD, начиная с AMD K6 3D. Причиной создания 3DNow! послужило стремление завоевать превосходство над процессорами производства компании Intel в области обработки мультимедийных данных.
Технология 3DNow! ввела 21 новую команду процессора и возможность оперировать 32-битными вещественными типами в стандартных MMX-регистрах. Также были добавлены специальные инструкции, оптимизирующие переключение в режим MMX/3DNow! (femms, которая заменяла стандартную инструкцию emms) и работу с кэшем процессора. Таким образом технология 3DNow! расширяла возможности технологии MMX, не требуя введения новых режимов работы процессора и новых регистров.
[править]
Проверка поддержки 3DNow! процессором
Перед началом работы с расширением 3DNow! следует убедиться, что ЦП их поддерживает. Для этого используется инструкция CPUID. Общий порядок действий при проверке выглядит следующим образом:
Убедиться, что процессор поддерживает инструкцию CPUID. Если нет, то ЦП не поддерживает и 3DNow!.
Выполнить инструкцию cpuid со значением EAX = 0 — это необходимо для следующего шага.
Выполнить CPUID со значением EAX = 80000000h. Если после выполнения инструкции в EAX будет значение меньше 1, то 3DNow! не поддерживается.
Выполнить CPUID с EAX = 80000001h. Если после выполнения бит 31 регистра EDX будет установлен в 1, то 3DNow! поддерживается. Иначе — нет.
[править]
Инструкции 3DNow!
PAVGUSB — вычисление среднего 8-битовых целых значений
PI2FD — перевод 32-битных целых в вещественные числа
PF2ID — перевод вещественных в 32-битные целые числа
PFCMPGE — сравнение вещественных чисел, больше или равно
PFCMPGT — сравнение вещественных чисел, больше
PFCMPEQ — сравнение вещественных чисел, равно
PFACC — накопление суммы вещественных чисел
PFADD — сложение вещественных чисел
PFSUB — вычитание вещественных чисел
PFSUBR — обратное вычитание вещественных чисел
PFMIN — нахождение минимума вещественных чисел
PFMAX — нахождение максимума вещественных чисел
PFMUL — умножение вещественных чисел
PFRCP — нахождение приближённого значения обратного (1/x) вещественных чисел
PFRSQRT — нахождение приближённого значения обратного от квадратного корня (1/sqrt(x)) вещественных чисел
PFRCPIT1 — первый шаг вычисления значения обратного (1/x) вещественных чисел
PFRSQIT1 — первый шаг вычисления значения обратного от квадратного корня (1/sqrt(x)) вещественных чисел
PFRCPIT2 — второй шаr вычисления значения обратного или обратного от квадратного корня вещественных чисел
PMULHRW — умножение 16-битных целых чисел с округлением
FEMMS — быстрое переключение состояния FPU/MMX
PREFETCH/PREFETCHW — предвыборка строки кэша процессора из памяти
MMX (Multimedia Extensions — мультимедийные расширения) — коммерческое название дополнительного набора инструкций, выполняющих характерные для процессов кодирования/декодирования потоковых аудио/видео данных действия за одну машинную инструкцию. Впервые появился в процессорах Pentium MMX. Разработан в лаборатории Intel в Хайфе, Израиль, в первой половине 1990-х.Содержание [убрать]
Регистры MMX
Расширение MMX включает в себя восемь 64-битных регистров общего пользования MM0—MM7. Для совместимости со способами сохранения состояния процессора в существующих ОС Intel была вынуждена объединить в программной модели процессора восемь регистров MMX с мантиссами восьми регистров FPU (Математический сопроцессор). Аппаратно это могут быть разные устройства, но с точки зрения программиста - это одни и те же регистры. Таким образом, нельзя одновременно пользоваться командами Математического сопроцессора и MMX.
Типы данных MMX
Команды технологии MMX работают с 64-разрядными целочисленными данными, а также с данными, упакованными в группы (векторы) общей длиной 64 бита. Такие данные могут находиться в памяти или в восьми MMX-регистрах.
Команды технологии MMX работают со следующими типами данных:
упакованные байты (восемь байтов в одном 64-разрядном регистре) (англ. packed byte);
упакованные слова (четыре 16-разрядных слова в 64-разрядном регистре) (packed word);
упакованные двойные слова (два 32-разрядных слова в 64-разрядном регистре) (packed doubleword);
64-разрядные слова (quadword).
Синтаксис
MMX-команды имеют следующий синтаксис: instruction [dest, src] Здесь instruction — имя команды, dest обозначает выходной операнд, src — входной операнд.
В систему команд введено 57 дополнительных инструкций для одновременной обработки нескольких единиц данных. Большинство команд имеют суффикс, который определяет тип данных и используемую арифметику:
US (unsigned saturation) — арифметика с насыщением, данные без знака.
S или SS (signed saturation) — арифметика с насыщением, данные со знаком. Если в суффиксе нет ни S, ни SS, используется циклическая арифметика (wraparound).
B, W, D, Q указывают тип данных. Если в суффиксе есть две из этих букв, первая соответствует входному операнду, а вторая — выходному.
Новые инструкции включают следующие группы:
Команды пересылки данных (Data Transfer Instructions) между регистрами MMX и целочисленными регистрами и памятью;
Команды преобразования типов
Арифметические операции (Arithmetic Instructions), включающие сложение и вычитание в разных режимах, умножение и комбинацию умножения и сложения;
Команды сравнения (Comparison Instructions) элементов данных на равенство или по величине;
Логические операции (Logical Instructions)- И,И-НЕ,ИЛИ и Исключающие ИЛИ, выполняемые над 64 битными операндами;
Сдвиговые операции (Shift Instructions) логические и арифметические;
Команды управления состоянием (Empty MMX State) очистка MMX - установка признаков пустых регистров в слове тегов.
Инструкции MMX не влияют на флаги условий. Регистры MMX, в отличие от регистров FPU, адресуются физически, а не относительно TOS. Любая инструкция MMX обнуляет поле TOS регистра состояния FPU. Инструкции MMX доступны из любого режима процессора.
SSE2 (англ. Streaming SIMD Extensions 2, потоковое SIMD-расширение процессора) — это SIMD (англ. Single Instruction, Multiple Data, Одна инструкция — множество данных) набор инструкций, разработанный Intel, и впервые представленный в процессорах серии Pentium 4. SSE2 расширяет набор инструкций SSE с целью полностью вытеснить MMX. SSE2 добавила 144 новых команд к SSE, в котором было только 70 команд.
[править]
Особенности
SSE2 использует восемь 128-битных регистров (xmm0 до xmm7), включённых в архитектуру x86 с вводом расширения SSE, каждый из которых трактуется как 2 последовательных значения с плавающей точкой двойной точности.
SSE2 включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных.
SSE2 содержит инструкции для потоковой обработки целочисленных данных в тех же 128-битных xmm регистрах, что делает это расширение более предпочтительным для целочисленных вычислений, нежели использование набора инструкций MMX, появившегося гораздо раньше.
SSE2 включает в себя две части – продолжение SSE и продолжение MMX.
Продолжение SSE работает с вещественными числами.
продолжение MMX работает с целыми. В SSE2 регистры по сравнению с MMX удвоились (64 бита -> 128 битов). Т.к. скорость выполнения инструкций не изменилась, при оптимизации под SSE2 программа получает двукратный прирост производительности. Если программа уже была оптимизирована под MMX, то оптимизация под SSE2 даётся сравнительно легко в силу сходности системы команд.
SSE2 включает в себя ряд команд управления кэшем, предназначенных для минимизации загрязнения кэша при обработке неопределенных потоков информации.
SSE2 включает в себя сложные дополнения к командам преобразования чисел
SSE3 (PNI — Prescott New Instruction) — третья версия SIMD-расширения Intel, потомок SSE, SSE2 и MMX. Впервые представлено 2 февраля 2004 года в ядре Prescott процессора Pentium 4. В 2005 AMD предложила свою реализацию SSE3 для процессоров Athlon 64 (ядра Venice, San Diego и Newark).
Набор SSE3 содержит 13 инструкций: FISTTP (x87), MOVSLDUP (SSE), MOVSHDUP (SSE), MOVDDUP (SSE2), LDDQU (SSE/SSE2), ADDSUBPD (SSE), ADDSUBPD (SSE2), HADDPS (SSE), HSUBPS (SSE), HADDPD (SSE2), HSUBPD (SSE2), MONITOR (нет аналога в SSE3 для AMD), MWAIT (нет аналога в SSE3 для AMD).
Наиболее заметное изменение - возможность горизонтальной работы с регистрами. Если говорить более конкретно, добавлены команды сложения и вычитания нескольких значений, хранящихся в одном регистре. Эти команды упростили ряд DSP и 3D-операций. Существует также новая команда для преобразования значений с плавающей точкой в целые без необходимости вносить изменения в глобальном режиме округления.Содержание [убрать]
Инструкции SSE3
ADDSUBPD (Add Subtract Packed Double).
ADDSUBPS (Add Subtract Packed Single).
HADDPD (Horizontal Add Packed Double).
HADDPS (Horizontal Add Packed Single).
HSUBPD (Horizontal Subtract Packed Double).
HSUBPS (Horizontal Subtract Packed Single).
FISTTP — преобразование вещественного числа в целое с сохранением целочисленного значения и округлением в сторону нуля.
LDDQU — загрузка 128bit невыровненных данных из памяти в регистр xmm, с предотвращением пересечения границы строки кеша.
Процессоры с поддержкой SSE3
AMD:
Athlon 64 (начиная с Venice Stepping E3 и San Diego Stepping E4)
Athlon 64 X2
Athlon 64 FX (since San Diego Stepping E4)
Opteron (начиная с Stepping E4)
Sempron (начиная с Palermo. Остановлено в E3)
Phenom
Phenom II
Athlon II
Turion 64
Turion 64 X2
Intel:
Celeron D
Celeron 420, 430 and 440
Pentium 4 (начиная с Prescott)
Pentium D
Pentium Dual-Core
Pentium Extreme Edition (но НЕ Pentium 4 Extreme Edition)
Intel Core Duo
Intel Core Solo
Intel Core 2 Duo
Intel Core 2 Extreme
Intel Core 2 Quad
Xeon (начиная с Nocona)
Atom
Intel Core i5
Intel Core i7
VIA/Centaur:
C7
Nano
Transmeta
Efficeon TM88xx (NOT Model Numbers TM86xx)
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).
Компилятор языка Си от Intel начиная с версии 10 генерирует инструкции SSE4 при задании опции -QxS. Компилятор Sun Studio от Sun Microsystems с версии 12 update 1 генерирует инструкции SSE4 с помощью опций -xarch=sse4_1 (SSE4.1) и -xarch=sse4_2 (SSE4.2)[2].Содержание [убрать]
Изменения
Добавлены инструкции, ускоряющие компенсацию движения в видеокодеках, быстрое чтение из 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 определяется 3-мя битами непосредственного аргумента 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 | |
| PMOVZXBW | 16 бит |
+-----------------------------+-------------------------+
| PMOVSXBD PMOVSXWD | |
| PMOVZXBD PMOVZXWD | 32 бита |
+-----------------------------+-------------------------+
| PMOVSXBD PMOVSXWD PMOVSXWQ | |
| PMOVZXBD PMOVZXWD PMOVZXWQ | 64 бита |
+-----------------------------+-------------------------+
Векторные примитивы
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, B2 }
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, B2 }
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 битного аргумента (используется полином 0x11EDC6F41).
Подсчет популяции единичных бит
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-х битных масок.
Процессоры с SSE4
Семейство Penryn процессоров Intel (ядра Wolfdale, Yorkfield и более новые)
Семейство Nehalem от Intel.
относится к работе с внутренней памятью процессора и выполнению арифметических операций. В SIMD компьютере управление выполняется контроллером, а "арифметика" отдана процессорным элементам.
SIMD процессоры называются также векторными.
SIMD-расширения, используемые в процессорах архитектуры x86
MMX — Multimedia Extensions. Коммерческое название дополнительного набора инструкций, выполняющих характерные для процессов кодирования/декодирования потоковых аудио/видео данных действия за одну машинную инструкцию. Впервые появился в процессорах Pentium MMX.
MMX Extended — расширенный набор инструкций MMX, используемый в процессорах AMD и Cyrix.
3DNow! — расширение набора команд MMX процессоров AMD, начиная с AMD K6-2.
3DNow! Extended — расширение набора команд 3DNow! процессоров AMD, начиная с AMD Athlon.
SSE — набор инструкций, разработанный Intel, и впервые представленный в процессорах серии Pentium III как ответ на аналогичный набор инструкций 3DNow! от AMD, который был представлен годом раньше.
SSE2 — набор инструкций, разработанный Intel, и впервые представленный в процессорах серии Pentium 4.
SSE3 — третья версия SIMD-расширения Intel, потомок SSE, SSE2 и x87. Представлен 2 февраля 2004 года в ядре Prescott процессора Pentium 4.
SSSE3 — набор SIMD-инструкций, используемый в процессорах Intel Core 2 Duo.
SSE4 — новая версия SIMD-расширения Intel. Анонсирован 27 сентября 2006 года. Представлен в 2007 году процессорах серии Penryn.
AVX — анонсированная версия SIMD-расширения Intel, которая будет представлена в 2010 году в процессорах архитектуры Sandy Bridge.
SISD (англ. Single Instruction, Single Data) или ОКОД (Одиночный поток Команд и Одиночный поток Данных) — архитектура компьютера, в которой один процессор выполняет один поток команд, оперируя одним потоком данных. Относится к фон-Неймановской архитектуре.
SISD компьютеры это обычные, "традиционные" последовательные компьютеры, в которых в каждый момент времени выполняется лишь одна операция над одним элементом данных (числовым или каким-либо другим значением). Большинство современных персональных ЭВМ, например, попадает именно в эту категорию. Иногда сюда относят и некоторые типы векторных компьютеров, это зависит от того, что понимать под потоком данных, но обсуждать эти детали здесь мы не будем.
Классификация параллельных архитектур по Флинну (M. Flynn)
Классификация по Флинну Одиночный поток команд
(Single Instruction) Множество потоков команд
(Multiple Instruction)
Одиночный поток данных
(Single Data) SISD MISD
Множество потоков данных
(Multiple Data) SIMD MIMD
ОКОД - Вычислительная система с одиночным потоком команд и одиночным потоком данных
(SISD, Single Instruction stream over a Single Data stream).
ОКМД - Вычислительная система с одиночным потоком команд и множественным потоком данных
(SIMD, Single Instruction, Multiple Data).
МКОД - Вычислительная система со множественным потоком команд и одиночным потоком данных
(MISD, Multiple Instruction Single Data).
МКМД - Вычислительная система со множественным потоком команд и множественным потоком данных
(MIMD, Multiple Instruction Multiple Data).
Типичными представителями SIMD являются векторные архитектуры. К классу MISD ряд исследователей относит конвейерные ЭВМ, однако это не нашло окончательного признания, поэтому можно считать, что реальных систем — представителей данного класса не существует. Класс MIMD включает в себя многопроцессорные системы, где процессоры обрабатывают множественные потоки данных. Отношение конкретных машин к конкретному классу сильно зависит от точки зрения исследователя. Так, конвейерные машины могут быть отнесены и к классу SISD (конвейер — единый процессор), и к классу SIMD (векторный поток данных с конвейерным процессором) и к классу MISD (множество процессоров конвейера обрабатывают один поток данных последовательно), и к классу MIMD — как выполнение последовательности различных команд (операций ступеней конвейера) на множественным скалярным потоком данных (вектором).
Суперскалярные и VLIW машины
Существуют два типа машин (процессоров), выдающих несколько команд за один такт: суперскалярные машины и VLIW-машины. Суперскалярные машины могут выдавать на выполнение в каждом такте переменное число команд, и работа их конвейеров может планироваться как статически с помощью компилятора, так и с помощью аппаратных средств динамической оптимизации. Суперскалярные машины используют параллелизм на уровне команд путем посылки нескольких команд из обычного потока команд в несколько функциональных устройств. Дополнительно, чтобы снять ограничения последовательного выполнения команд, эти машины используют механизмы внеочередной выдачи и внеочередного завершения команд, прогнозирование переходов, кэши целевых адресов переходов и условное (по предположению) выполнение команд. В отличие от суперскалярных машин, VLIW-машины выдают на выполнение фиксированное количество команд, которые сформатированы либо как одна большая команда, либо как пакет команд фиксированного формата. Планирование работы VLIW-машины всегда осуществляется компилятором. В типичной суперскалярной машине аппаратура может осуществлять выдачу от одной до восьми команд в одном такте. Обычно эти команды должны быть независимыми и удовлетворять некоторым ограничениям, например таким, что в каждом такте не может выдаваться более одной команды обращения к памяти. Если какая-либо команда в потоке команд является логически зависимой или не удовлетворяет критериям выдачи, на выполнение будут выданы только команды, предшествующие данной. Поэтому скорость выдачи команд в суперскалярных машинах является переменной. Это отличает их от VLIW-машин, в которых полную ответственность за формирование пакета команд, которые могут выдаваться одновременно, несет компилятор, а аппаратура в динамике не принимает никаких решений относительно выдачи нескольких команд. Использование VLIW приводит в большинстве случаев к быстрому заполнению небольшого объема внутрикристальной памяти командами NOP (no operation), которые предназначены для тех устройств, которые не будут задействованы в текущем цикле. В существующих VLIW разработках был найден большой недостаток, который был устранен делением длинных слов на более мелкие, параллельно поступающие к каждому устройству. Обработка множества команд независимыми устройствами одновременно является главной особенностью суперскалярной процессорной архитектуры.
Классификация Хокни (R. Hockney)
Классификация машин MIMD-архитектуры :
Переключаемые — с общей памятью и с распределённой памятью.
Конвейерные.
Сети — регулярные решётки, гиперкубы, иерархические структуры, изменяющие конфигурацию.
В класс конвейерных архитектур (по Хокни) попадают машины с одним конвейерным устройством обработки, работающим в режиме разделения времени для отдельных потоков. Машины, в которых каждый поток обрабатывается своим собственным устройством Хокни назвал переключаемыми. В класс переключаемых машин попадают машины, в которых возможна связь каждого процессора с каждым, реализуемая с помощью переключателей — машины с распределённой памятью. Если же память есть разделяемый ресурс, машина называется с общей памятью. При рассмотрении машин с сетевой структурой Хокни считал, что все они имеют распределённую память. Дальнейшую классификацию он проводил в соответствии с топологией сети.
Классификация Фенга (T. Feng)
В 1972 году Фенг предложил классифицировать вычислительные системы на основе двух простых характеристик. Первая — число n бит в машинном слове, обрабатываемых параллельно при выполнении машинных инструкций. Практически во всех современных компьютерах это число совпадает с длиной машинного слова. Вторая характеристика равна числу слов m, обрабатываемых одновременно данной ВС. Немного изменив терминологию, функционирование ВС можно представить как параллельную обработку n битовых слоёв, на каждом из которых независимо преобразуются m бит. Каждую вычислительную систему можно описать парой чисел (n, m). Произведение P = n x m определяет интегральную характеристику потенциала параллельности архитектуры, которую Фенг назвал максимальной степенью параллелизма ВС.
Параллельные системы также классифицируют по Хэндлеру (W. Handler), Шнайдеру (L.Snyder), Скилликорну (D. Skillicorn).
Классификация Скилликорна
Классификация Скилликорна (1989) была очередным расширением классификации Флинна. Архитектура любого компьютера в классификации Скилликорна рассматривается в виде комбинации четырёх абстрактных компонентов: процессоров команд (Instruction Processor — интерпретатор команд, может отсутствовать в системе), процессоров данных (Data Processor — преобразователь данных), иерархии памяти (Instruction Memory, Data Memory — память программ и данных), переключателей (связывающих процессоры и память). Переключатели бывают четырёх типов — «1-1» (связывают пару устройств), «n-n» (связывает каждое устройство из одного множества устройств с соответствующим ему устройством из другого множества, то есть фиксирует попарную связь), «n x n» (связь любого устройства одного множества с любым устройством другого множества). Классификация Скилликорна основывается на следующих восьми характеристиках:
Количество процессоров команд IP
Число ЗУ команд IM
Тип переключателя между IP и IM
Количество процессоров данных DP
Число ЗУ данных DM
Тип переключателя между DP и DM
Тип переключателя между IP и DP
Тип переключателя между DP и DP
Extended MMX, так же известное как EMMI (Extended Multi-Media Instructions), это расширение набора инструкций MMX, предложенное компанией Cyrix и внедрившей его в свои процессоры 6x86MX и MII. EMMI расширяет набор инструкций MMX 12-ю новыми командами, полезными при мультимедийной обработке. Это расширение не задействовано по умолчанию, и перед использованием требует включения с помощью BIOS или программно (требуется установить бит EMMX - CCR7 bit 0). EMMI никогда не пользовалось большой поддержкой со стороны производителей ПО или признанием конкурентов Cyrix (некоторые инструкции Intel SSE имеют такие же коды операций, что и инструкции EMMI, и не являются совместимыми с ними). Это расширение больше не включалось в набор инструкций процессоров, планирующихся к выходу после MII.
Набор инструкций EMMI включает команды[1]:
PADDSIW — Packed Add with Saturation, using Implied Destination
PAVEB — Packed Average
PDISTIB — Packed Distance and Accumulate with Implied Register
PMACHRIW — Packed Multiply and Accumulate with Rounding
PMAGW — Packed Magnitude
PMULHRW / PMULHRIW — Packed Multiply High with Rounding
PMVZB / PMVNZB / PMVLZB / PMVGEZB — Packed Conditional Move
PSUBSIW — Packed Subtract with Saturation, using Implied Destination
Supplemental Streaming SIMD Extension 3 (SSSE3) — это обозначение данное Intel’ом четвёртому расширению системы команд. Предыдущее имело обозначение SSE3 и Intel добавил ещё один символ 'S' вместо того, чтобы увеличить номер расширения, возможно потому, что они посчитали SSSE3 простым дополнением к SSE3. Часто, до того как стало использоваться официальное обозначение SSSE3, эти новые команды назывались SSE4. Также их называли кодовыми именами Tejas New Instructions (TNI) и Merom New Instructions (MNI) по названию процессоров, где впервые Intel намеревалась поддержать эти новые команды. Появившись в Intel Core Microarchitecture, SSSE3 доступно в сериях процессоров Xeon 5100 (Server и Workstation версии), а также в процессорах Intel Core 2 (Notebook и Desktop версии) и Intel Atom.
Новыми в SSSE3, по сравнению с SSE3, являются 16 уникальных команд, работающих с упакованными целыми. Каждая из них может работать как с 64-х битными (MMX), так и с 128-ми битными (XMM) регистрами, поэтому Intel в своих материалах ссылается на 32 новые команды.
Новые инструкции
Работа со знаком
PABSB, PABSW, PABSD — (Packed Absolute Value {Bytes/Words/DWords})
Input — { A0, A1… }
Output — { A0 * sign(A0), A1 * sign (A1)… }
Каждое поле результата есть абсолютная величина соответствующего поля из src1. Фактически это те же операции PSIGNB, PSIGNH, PSIGNW у которых оба аргумента один и тот же регистр.
PSIGNB, PSIGNW, PSIGND — (Packed Sign {Bytes/Words/DWords})
Input — { A0, A1… }, { B0, B1… }
Output — { A0 * sign(B0), A1 * sign (B1)… }
Каждое поле результата есть произведение поля из src1 на {-1,0,1} в зависимости от знака соответствующего поля в src2 (умножение на 0 когда поле в src2 равно нулю).
Сдвиги
PALIGNR — (Packed Align Right)
Input — { A0, A1 }, { B0, B1 }, imm8
Output — { B1_B0_A1_A0 >> (imm8 * 8) }
Два регистра операнда рассматривается как одно беззнаковое промежуточное значение удвоенной размерности из которого извлекается 64-х/128-х битное значение начиная с байта указанного в непосредственном аргументе-константе команды.
Перемешивание байт
PSHUFB — (Packed Shuffle Bytes)
Input — { A0, A1, A2,.. A7/A15 }, { B0, B1, B2,.. B7/B15 }
Output — { [AB0 AB1 AB2 …] }
Перестановка байт, каждый байт результата есть некоторый байт из первого аргумента определяемый по соответствующему байту из второго аргумента (если байт отрицательный, то в байт результат прописывается ноль, иначе используются младшие 3 или 4 бита как номер байта в первом аргументе).
Умножения
PMULHRSW — (Packed Multiply High with Round and Scale)
Input — { A0, A1… }, { B0, B1… }
Output — { A0 * B0, A1 * B1… }
Аргументы A и B рассматриваются как вектора 16-ти битных знаковых чисел с фиксированной запятой представленных в диапазоне [-1,+1) (то есть 0x4000 это 0.5, а 0xa000 это −0.75 и т. д.), которые перемножаются друг с другом с корректным округлением.
PMADDUBSW — (Multiply and Add Packed Signed and Unsigned Bytes)
Input — { A0, A1, A2, A3,.. }, { B0, B1, B2, B3,.. }
Output — { (A0*B0+A1*B1), (A2*B2+A3*B3), … }
Производится побайтное перемножение векторов A и B, промежуточные 16-ти битные результаты попарно складываются между собой с насыщением и выдаются как результат.
Горизонтальные сложения/вычитания целых
PHSUBW, PHSUBD — (Packed Horizontal Subtract (16-ти или 32-х битные поля))
Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
Output — { A0-A1 A2-A3 … B0-B1 B2-B3 …}
Горизонтальное вычитание целых 16/32 битных полей.
PHSUBSW — (Packed Horizontal Subtract and Saturate Words (16-ти битные поля))
Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
Output — { A0-A1 A2-A3 B0-B1 B2-B3 }
Горизонтальное вычитание целых 16 битных полей с насыщением.
PHADDW, PHADDD — (Packed Horizontal Add (16-ти или 32-х битные поля))
Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
Output — { A0+A1 A2+A3 … B0+B1 B2+B3 …}
Горизонтальное сложение целых 16/32 битных полей.
PHADDSW — (Packed Horizontal Add and Saturate Words (16-ти битные поля))
Input — { A0, A1, A2, A3 }, { B0, B1, B2, B3 }
Output — { A0+A1 A2+A3 … B0+B1 B2+B3 …}
Горизонтальное сложение целых 16 битных полей с насыщением.
Процессоры поддерживающие SSSE3
Intel:
Xeon 5100 Series
Intel Core 2
Intel Celeron (ядро Conroe-L)
Intel Atom
Intel Dual Core
Advanced Vector Extensions (AVX) — расширение системы команд x86 для микропроцессоров Intel и AMD, предложенное Intel в марте 2008.[1]
AVX предоставляет различные улучшения, новые инструкции и новую схему кодирования машинных кодов.
Улучшения
Размер векторных регистров SIMD увеличивается с 128 (XMM) до 256 бит (регистры YMM0 — YMM15). Существующие 128-битные инструкции будут использовать младшую половину новых YMM регистров. В будущем возможно расширение до 512 или 1024 бит.
Неразрушающие операции. Набор инструкций AVX позволяет использовать любую двухоперандную инструкцию XMM в трёхоперандном виде без модификации двух регистров-источников, с отдельным регистром для результата. Например, вместо a = a + b можно использовать c = a + b, при этом регистр a остаётся неизменённым. AVX не поддерживает неразрушающие формы операций над обычными регистрами общего назначения, такими как EAX, но такая поддержка, возможно, будет добавлена в последующих расширениях.
Требования выравнивания данных для операндов SIMD в памяти ослаблены.
Новая схема кодирования
Основная статья: :en:VEX prefix
Новая система кодирования машинных кодов VEX предоставляет новый набор префиксов кода, которые расширяют пространство возможных машинных кодов. Добавлены инструкции с количеством операндов более трёх. Векторные регистры SIMD могут быть больше 128-ми бит.
Новые иструкцииИнструкция Описание
VBROADCASTSS, VBROADCASTSD, VBROADCASTF128 Копирует 32-х, 64-х или 128-ми битный операнд из памяти во все элементы векторного регистра XMM или YMM.
VINSERTF128 Замещает младшую или старшую половину 256-ти битного регистра YMM значением 128-ми битного операнда. Другая часть регистра-получателя не изменяется.
VEXTRACTF128 Извлекает младшую или страшую половину 256-ти битного регистра YMM и копирует в 128-ми битный операнд-назначение.
VMASKMOVPS, VMASKMOVPD Условно считывает любое количество элементов из векторного операнда из памяти в регистр-получатель, оставляя остальные элементы несчитанными и обнуляя соответствующие им элементы регистра-получателя. Также может условно записывать любое количество элементов из векторного регистра в векторный операнд в памяти, оставляя остальные элементы операнда памяти неизменёнными
VPERMILPS, VPERMILPD Переставляет 32-х или 64-х битные элементы вектора согласно операнду-селектору (из памяти или из регистра).
VPERM2F128 Переставляет 4 128-ми битных элемента двух 256-ти битных регистров в 256-ти битный операнд-назначение с использованием непосредственной константы (imm) в качестве селектора.
VZEROALL Обнуляет все YMM регистры и помечает их как неиспользуемые. Используется при переключении между 128-ми битным режимом и 256-ти битным.
VZEROUPPER Обнуляет старшие половины всех регистров YMM. Используется при переключении между 128-ми битным режимом и 256-ти битным.
Также в спецификации AVX описана группа инструкций PCLMUL (Parallel Carry-Less Multiplication, Parallel CLMUL)
PCLMULLQLQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 00]
PCLMULHQLQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 01]
PCLMULLQHQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 02]
PCLMULHQHQDQ xmmreg,xmmrm [rm: 66 0f 3a 44 /r 03]
PCLMULQDQ xmmreg,xmmrm,imm [rmi: 66 0f 3a 44 /r ib]
Применение
Подходит для интенсивных вычислений с плавающей точкой в мультимедиа, научных и финансовых задачах. Увеличивает степень параллелизма и пропускную способность в вещественных SIMD вычислениях. Уменьшает давление (нагрузку) на регистры благодаря неразрушающим трёхоперандным операциям.
Поддержка в операционных системах
Использование YMM регистров требует поддержки со стороны операционной системы. Следующие системы поддерживают регистры YMM:
Linux: с версии ядра 2.6.30,[2] released on June 9, 2009.[3]
Windows: Windows 7 и Windows Server 2008 R2 (без подтверждений)
BSD: ?
Mac OS X: ?
Микропроцессоры с AVX
Intel
Проектируемая микроархитектура Intel Sandy Bridge, 2010.[4]
AMD:
Планируемый процессор Bulldozer, 2011.[5]
Совместимость между реализациями Intel и AMD обсуждается в XOP instruction set.
Будущие расширения
Схема кодирования машинного кода VEX допускает дальнейшее расширение ширины регистров SIMD.
Различные планируемые дополнения системы команд x86:
AES
CLMUL
Intel FMA3
AMD FMA4
AMD XOP
AMD CVT16
Расширение системы команд AES (Advanced Encryption Standard) — расширение системы команд x86 для микропроцессоров, предложенное компанией Intel в марте 2008[1]. Целью данного расширения является ускорение приложений, использующий шифрование и дешифрование по алгоритму AES. Сходное расширение PadLock engine существует в микропроцессорах от VIA Technologies.
Новые инструкцииИнструкция Описание
AESENC Выполнить один раунд шифрования AES
AESENCLAST Выполнить последний раунд шифрования AES
AESDEC Выполнить один раунд расшифрования AES
AESDECLAST Выполнить последний раунд расшифрования AES
AESKEYGENASSIST Поспособствовать в генерации раундового ключа AES
AESIMC Inverse Mix Columns
Микропроцессоры с расширением команд AES
Intel
Intel Westmere (Nehalem на 32нм техпроцессе).
AMD:
Проектируемый Bulldozer, 2011[2].
См. также
AES
CLMUL instruction set
FMA3
FMA4
AVX
X86