SSE
![]() | Ця стаття містить перелік посилань, але походження тверджень у ній залишається незрозумілим через практично повну відсутність внутрішньотекстових джерел-виносок. |
![](http://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/XMM_registers.svg/220px-XMM_registers.svg.png)
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 };