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

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

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

Див. також

Посилання