SSE
![]() | Ця стаття містить перелік посилань, але походження тверджень у ній залишається незрозумілим через практично повну відсутність внутрішньотекстових джерел-виносок. |
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 };
Подальший розвиток[ред. | ред. код]
![]() | Цей розділ потребує доповнення. |