SSE

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
XMM registers.svg

SSE (англ. Streaming SIMD Extensions, потокове SIMD-розширення процесора) — це SIMD (англ. Single Instruction, Multiple Data, Одна інструкція — багато даних) набір інструкцій, розроблених Intel, і вперше представлених у процесорах серії Pentium III як відповідь на аналогічний набір інструкцій 3DNow! від AMD, який був представлений роком раніше. Початкова назва цих інструкцій була KIN, що розшифровувалася як Katmai New Instructions (Katmai — назва першої версії ядра процесора Pentium III).

Технологія SSE дозволяла вирішити 2 основні проблеми MMX — при використанні MMX неможливо було одночасно використовувати інструкції співпроцесора, так як його регістри використовувалися для MMX і роботи з дійсними числами.

SSE включає в архітектуру процесора вісім 128-бітових регістрів (xmm0 до xmm7), кожен з яких трактується, як послідовність 4 значень із рухомою крапкою одиничної точності. SSE містить набір інструкцій, які виконують операції зі скалярними і упакованими типами даних.

Перевага у швидкості обчислень досягається в тому випадку, коли необхідно виконати одну і ту саму послідовність дій над різними даними.

Реалізація блоків SIMD виконується розпаралелюванням обчислювального процесу між даними. Тобто коли через один блок даних проходить по черзі багато потоків даних.

Приклад[ред.ред. код]

Наступний приклад демонструє перемноження чотирьох пар чисел з рухомою крапкою однією командою 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
};

Див. також[ред.ред. код]

Посилання[ред.ред. код]