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 };
Цей розділ потребує доповнення. |