SSE | это... Что такое SSE? (original) (raw)

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, и возможность MMX работать только с целыми числами.

SSE включает в архитектуру процессора восемь 128-битных регистров и набор инструкций, работающих со скалярными и упакованными типами данных.

Преимущество в производительности достигается в том случае, когда необходимо произвести одну и ту же последовательность действий над разными данными. В таком случае блоком SSE осуществляется распараллеливание вычислительного процесса между данными.

Особенности

Регистры

В SSE добавлены восемь (шестнадцать) 128-битных регистров, которые называются xmm0 — xmm7 (-xmm15).

XMM registers.svg

Каждый регистр может содержать четыре 32-битных значения с плавающей точкой одинарной точности.

SSE-команды

Команды для чисел с плавающей точкой

Команды для целых чисел

Другие команды

Пример

Следующий пример демонстрирует перемножение четырёх пар чисел с плавающей точкой одной инструкцией mulps: (Программа написана на языке ANSI C++ с использованием ассемблерной вставки __asm и инструкций ассемблера для работы с SSE, аргументы записаны согласно стандарту Intel, а не AT&T)

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

};

Тот же пример, но ассемблерная вставка asm выполнена в стандарте AT&T (GNU Assembler)

float a[4] = { 300.0, 4.0, 4.0, 12.0 }; float b[4] = { 1.5, 2.5, 3.5, 4.5 };

asm volatile ( "movups %[a], %%xmm0\n\t" // поместить 4 переменные с плавающей точкой из a в регистр xmm0 "mulps %[b], %%xmm0\n\t" // перемножить пакеты плавающих точек: xmm0 = xmm0 * b // xmm00 = xmm00 * b[0] // xmm01 = xmm01 * b[1] // xmm02 = xmm02 * b[2] // xmm03 = xmm03 * b[3] "movups %%xmm0, %[a]\n\t" // выгрузить результаты из регистра xmm1 по адресам a : : [a]"m"(*a), [b]"m"(*b) : "%xmm0", "%xmm1" );

См. также

Ссылки

Наборы расширения базовых инструкций процессоров семейства x86
MMX | MMXEXT SSE SSE2 SSE3 SSSE3 SSE4 ATA 3DNow! 3DNowExt SSE5 AVX AES