В вычислительной технике потоковые расширения SIMD ( SSE ) — это расширение набора инструкций SIMD для архитектуры x86 , разработанное корпорацией Intel и представленное в 1999 году в серии центральных процессоров (ЦП) Pentium III вскоре после появления 3DNow! от Advanced Micro Devices (AMD) . 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.
AMD добавила подмножество SSE, 19 из них, называемых новыми инструкциями MMX [3] и известных как несколько вариантов и комбинаций SSE и MMX, вскоре после выпуска оригинального Athlon в августе 1999 года, см. расширения 3DNow!. В конечном итоге 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.x = v1.x + v2.x ; vec_res.y = v1.y + v2.y ; vec_res.z = v1.z + v2.z ; vec_res.w = v1.w + v2.w ;
Это соответствует четырем инструкциям x86 FADD в объектном коде. С другой стороны, как показывает следующий псевдокод, одна 128-битная инструкция «packed-add» может заменить четыре инструкции скалярного сложения.
movaps xmm0 , [ v1 ] ;xmm0 = v1.w | v1.z | v1.y | 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
инструкцию ( Population count : подсчет количества битов, установленных в 1, широко используется, например, в криптографии ) и многое другое.Следующие программы можно использовать для определения того, какие версии SSE поддерживаются в системе (если таковые имеются):