SSE
Ця стаття містить перелік посилань, але походження тверджень у ній залишається незрозумілим через практично повну відсутність внутрішньотекстових джерел-виносок. Будь ласка, допоможіть поліпшити цю статтю, перетворивши джерела з переліку посилань на джерела-виноски у самому тексті статті. |
![](http://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/XMM_registers.svg/220px-XMM_registers.svg.png)
SSE (англ. Streaming SIMD Extensions, потокове SIMD-розширення) — розширення архітектури мікропроцесорів x86, що реалізує паралельне виконання однакових команд (англ. Single Instruction, Multiple Data, одна інструкція — багато даних).
Історія
Технологія була розроблена Intel як відповідь на аналогічний набір інструкцій 3DNow! від AMD, який був представлений роком раніше. Вперше реалізована в процесорі серії Pentium III. Початкова назва цих інструкцій була KIN, що розшифровувалося як Katmai New Instructions (Katmai — назва першої версії ядра процесора Pentium III).
Технологія SSE дозволяла вирішити 2 основні проблеми MMX:
- під час операцій MMX неможливо було одночасно виконувати інструкції співпроцесора (оскільки деякі регістри були об'єднаними)
- MMX обмежувалася лише цілочисельними операціями.
Архітектура
SSE включила в архітектуру процесора вісім 128-бітових регістрів (xmm0 до xmm7), кожен з яких трактується, як послідовність 4 значень із рухомою комою одиничної точності, та набір інструкцій, які виконують операції зі скалярними й пакованими типами даних.
Перевага у швидкості обчислень досягається в тому випадку, коли необхідно виконати одну і ту ж послідовність дій над різними даними.
Реалізація блоків 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 };
Подальший розвиток
Цей розділ потребує доповнення. |
Див. також
- SISD
- MIMD
Посилання
- Intel® 64 and IA-32 Architectures Optimization Reference Manual [Архівовано 10 січня 2017 у Wayback Machine.]