В вычислительной технике Streaming SIMD Extensions ( SSE ) — это расширение набора команд одной инструкции, нескольких данных ( SIMD ) для архитектуры x86 , разработанное Intel и представленное в 1999 году в серии центральных процессоров (ЦП) Pentium III вскоре после появления передовых микроустройств (AMD) 3DNow! . SSE содержит 70 новых инструкций (65 уникальных мнемоник [1] с использованием 70 кодировок), большинство из которых работают с данными с плавающей запятой одинарной точности . Инструкции SIMD могут значительно повысить производительность, когда одни и те же операции необходимо выполнить с несколькими объектами данных. Типичными приложениями являются цифровая обработка сигналов и обработка графики .
Первой разработкой Intel IA-32 SIMD был набор инструкций MMX . У MMX было две основные проблемы: он повторно использовал существующие регистры x87 с плавающей запятой, из-за чего процессоры не могли одновременно работать как с данными с плавающей запятой, так и с SIMD, и работал только с целыми числами . Инструкции SSE с плавающей запятой работают с новым независимым набором регистров, регистрами XMM, и добавляют несколько целочисленных инструкций, которые работают с регистрами MMX.
Впоследствии SSE был расширен Intel до SSE2 , SSE3 , SSSE3 и SSE4 . Поскольку он поддерживает математические вычисления с плавающей запятой, он имел более широкое применение, чем MMX, и стал более популярным. Добавление поддержки целых чисел в SSE2 сделало MMX в значительной степени ненужным, хотя в некоторых ситуациях можно добиться дальнейшего повышения производительности [ когда? ] с использованием MMX параллельно с операциями SSE.
Первоначально SSE назывался Katmai New Instructions ( KNI ), причем Katmai — кодовое название первой версии ядра Pentium III. Во время проекта Katmai Intel стремилась отличить его от своей более ранней линейки продуктов, особенно от своего флагманского Pentium II . Позже он был переименован в Internet Streaming SIMD Extensions ( ISSE [2] ), а затем в SSE.
Вскоре после выпуска оригинального Athlon в августе 1999 года компания AMD добавила подмножество SSE, 19 из них, называемое новыми инструкциями MMX [3] и известное как несколько вариантов и комбинаций SSE и MMX, см. [расширения]. В конечном итоге AMD добавила полную поддержку инструкций SSE, начиная со своих процессоров Athlon XP и Duron ( ядро Morgan ).
Первоначально в SSE были добавлены восемь новых 128-битных регистров, известных как XMM0
сквозные XMM7
. Расширения AMD64 от AMD (первоначально называвшиеся x86-64 ) добавили еще восемь регистров XMM8
через XMM15
, и это расширение дублируется в архитектуре Intel 64 . Также имеется новый 32-битный регистр управления/состояния MXCSR
. Регистры XMM8
через XMM15
доступны только в 64-битном режиме работы.
SSE использовал только один тип данных для регистров XMM:
Позже SSE2 расширит использование регистров XMM, включив в него:
Поскольку эти 128-битные регистры представляют собой дополнительные состояния машины, которые операционная система должна сохранять при переключении задач , они отключены по умолчанию до тех пор, пока операционная система явно не включит их. Это означает, что ОС должна знать, как использовать инструкции FXSAVE
и FXRSTOR
— расширенную пару инструкций, которая может одновременно сохранять все состояния регистров x86 и SSE. Эта поддержка была быстро добавлена во все основные операционные системы IA-32.
Первый процессор, поддерживающий SSE, Pentium III , разделял ресурсы выполнения между SSE и модулем с плавающей запятой (FPU). [2] Хотя скомпилированное приложение может чередовать инструкции FPU и SSE бок о бок, Pentium III не будет выдавать инструкции FPU и SSE в одном и том же такте . Это ограничение снижает эффективность конвейерной обработки , но отдельные регистры XMM позволяют смешивать SIMD и скалярные операции с плавающей запятой без снижения производительности из-за явного переключения режима MMX/с плавающей запятой.
SSE представила как скалярные , так и упакованные инструкции с плавающей запятой.
MOVSS
MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS, MOVMSKPS
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
Следующий простой пример демонстрирует преимущество использования SSE. Рассмотрим такую операцию, как сложение векторов, которая очень часто используется в приложениях компьютерной графики. Чтобы сложить два четырехкомпонентных вектора одинарной точности с использованием x86, требуются четыре инструкции сложения с плавающей запятой.
vec_res . х = v1 . х + v2 . Икс ; vec_res . у = v1 . у + v2 . й ; vec_res . z = v1 . г + v2 . з ; vec_res . ш = v1 . ш + v2 . ш ;
Это соответствует четырем инструкциям x86 FADD в объектном коде. С другой стороны, как показывает следующий псевдокод, одна 128-битная инструкция «упакованного сложения» может заменить четыре инструкции скалярного сложения.
movaps xmm0 , [ v1 ] ;xmm0 = v1.w | v1.z | v1.у | v1.x addps xmm0 , [ v2 ] ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x movaps [ vec_res ], xmm0 ;xmm0
popcnt
инструкцию ( подсчет населения : подсчет количества битов, установленных на 1, широко используемую, например, в криптографии ) и многое другое.Следующие программы можно использовать, чтобы определить, какие версии SSE поддерживаются в системе (если таковые имеются).