Расширения SSE
Общие сведения
SSE (Streaming SIMD Extensions) - расширение инструкций процессора для потоковой обработки в режиме SIMD (Single Instruction Multiple Data), т.е. когда требуется применять однотипные операции к потоку данных.
Расширение SSE разработано компанией Intel и было впервые применено в процессоре Intel Pentium III с ядром Katmai. Отсюда изначальное название KNI (Katmai New Instructions). Технология SSE позволила преодолеть проблемы MMX - при использовании MMX невозможно было одновременно использовать инструкции сопроцессора, так как его регистры задействовались для MMX и работы с вещественными числами.
В общем случае, к архитектуре процессора добавляется ряд самих инструкций и несколько 128-битных регистров с различной интерперетацией. Тем не менее, хотя изначально каждый регистр трактуется как два значения с плавающей точкой двойной точности (2*64-бит), операции могут применяться практически ко всем типам, "помещающимся" в 16 байт:
Это означает, например, что появляется возможность одновременно сложить или умножить с помощью всего одной инструкции два операнда из четырех чисел с плавающей точностью одинарной точности, двух - с двойной, двух 64-битных целочисленных, 16 8-битных целых и т.п.
Таким образом, для получения максимальной отдачи от SSE, следует использовать такие структуры данных, чтобы они максимально укладывались в эти 128-битные регистры. Если это не удается сделать изначально, то среди SSE существуют и специальные для этих целей инструкции.
Для програм с большим количеством ветвлений и условных операций рекомендуется, по возможности, заменить условные ветвления на логические и вычислительные операции.
Более подробно об этом можно прочитать в документе Using SSE and SSE2: Misconceptions and Reality на сайте Intel.
Впервые применено в | |
---|---|
SSE | Intel Pentium III |
SSE2 | Intel Pentium IV |
SSE3 | Intel Pentium IV (Prescott) |
SSE4 | Intel Core (Penryn) |
SSE
SSE включает в архитектуру процессора восемь 128-битных регистров (с xmm0 до xmm7), каждый из которых трактуется как 4 последовательных значения с плавающей точкой одинарной точности. SSE включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных.
SSE2
SSE2 использует восемь 128-битных регистров (с xmm0 до xmm7), включённых в архитектуру x86 с вводом расширения SSE, каждый из которых трактуется как 2 последовательных значения с плавающей точкой двойной точности. SSE2 включает в себя набор инструкций, который производит операции со скалярными и упакованными типами данных. Также SSE2 содержит инструкции для потоковой обработки целочисленных данных в тех же 128-битных xmm регистрах, что делает это расширение более предпочтительным для целочисленных вычислений, нежели MMX, появившийся гораздо ранее.
SSE3
Набор 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).
SSE4
SSE4 состоит из 54 инструкций, 47 из них относят к SSE4.1 (только они появятся в процессорах Penryn). Ожидается, что полный набор команд (SSE4.1 и SSE4.2, то есть 47 + оставшиеся 7 команд) будет доступен в процессорах Nehalem. Ни одна из SSE4 инструкций не работает с 64-х битными mmx регистрами (только с 128-ми битными xmm0-15).
Компилятор языка Си от Intel начиная с версии 10 будет генерировать инструкции SSE4 при задании опции -QxS.
Более подробную информацию по SSE4 можно найти на сайте Intel по ссылке.
© Лаборатория Параллельных
информационных технологий НИВЦ МГУ