Немає перевірених версій цієї сторінки; ймовірно, її ще не перевіряли на відповідність правилам проекту.

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
};

Подальший розвиток

ред.
Докладніше: SSE2, SSE3, SSSE3, SSE4 та Advanced Vector Extensions

Див. також

ред.

Посилання

ред.