SSE
SSE (англ. Streaming SIMD Extensions, потоковое SIMD-расширение процессора) — это SIMD (англ. Single Instruction, Multiple Data, Одна инструкция — множество данных) набор инструкций, разработанный Intel и впервые представленный в процессорах серии Pentium III как ответ на аналогичный набор инструкций 3DNow! от AMD, который был представлен годом раньше. Первоначально названием этих инструкций было KNI — Katmai New Instructions (Katmai — название первой версии ядра процессора Pentium III).
Технология SSE позволяла преодолеть две основные проблемы MMX: при использовании MMX невозможно было одновременно использовать инструкции сопроцессора, так как его регистры были общими с регистрами MMX, и возможность MMX работать только с целыми числами.
SSE включает в архитектуру процессора восемь 128-битных регистров и набор инструкций, работающих со скалярными и упакованными типами данных.
Преимущество в производительности достигается в том случае, когда необходимо произвести одну и ту же последовательность действий над разными данными. В таком случае блоком SSE осуществляется распараллеливание вычислительного процесса между данными.
Содержание
Особенности
- 8 (в x86-64 — 16) 128-битных регистров XMM.
- 32-битный (в x86-64 — 64) регистр флагов (MXCSR).
- 128-битный упакованный тип данных с плавающей точкой одинарной точности.
- Инструкции над вещественными числами одинарной точности.
- Инструкции явной предвыборки данных, контроля кэширования данных и контроля порядка операций сохранения.
Регистры
В SSE добавлены восемь (шестнадцать для x64) 128-битных регистров, которые называются xmm0 — xmm7 (-xmm15).
Каждый регистр может содержать четыре 32-битных значения с плавающей точкой одинарной точности.
SSE-команды
Команды для чисел с плавающей точкой
- Команды пересылки
- Скалярные типы – MOVSS
- Упакованные типы – MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS
- Арифметические команды
- Скалярные типы – ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSS
- Упакованные типы – ADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS
- Команды сравнения
- Скалярные типы – CMPSS, COMISS, UCOMISS
- Упакованные типы – CMPPS
- Перемешивание и распаковка
- Упакованные типы – SHUFPS, UNPCKHPS, UNPCKLPS
- Команды для преобразования типов
- Скалярные типы – CVTSI2SS, CVTSS2SI, CVTTSS2SI
- Упакованные типы – CVTPI2PS, CVTPS2PI, CVTTPS2PI
- Битовые логические операции
- Упакованные типы – ANDPS, ORPS, XORPS, ANDNPS
Команды для целых чисел
- Арифметические команды
- PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW
- Команды пересылки
- PEXTRW, PINSRW
- Другие
- PMOVMSKB, PSHUFW
Другие команды
- Работа с регистром MXCSR
- LDMXCSR, STMXCSR
- Управление кэшем и памятью
- MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE
Пример
Следующий пример демонстрирует перемножение четырёх пар чисел с плавающей точкой одной инструкцией mulps: (Программа написана на языке ANSI C++ с использованием ассемблерной вставки __asm и инструкций ассемблера для работы с SSE, аргументы записаны согласно стандарту Intel, а не AT&T)
__declspec(align(16)) float a[4] = { 300.0, 4.0, 4.0, 12.0 };
__declspec(align(16)) 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 xmm0, xmm1 ; // перемножить пакеты плавающих точек: xmm0 = xmm0 * xmm1
; // xmm00 = xmm10 * xmm00
; // xmm01 = xmm11 * xmm01
; // xmm02 = xmm12 * xmm02
; // xmm03 = xmm13 * xmm03
movups a, xmm0 ; // выгрузить результаты из регистра xmm0 по адресам a
};
Тот же пример, но ассемблерная вставка asm выполнена в стандарте AT&T (GNU Assembler)
float a[4] = { 300.0, 4.0, 4.0, 12.0 };
float b[4] = { 1.5, 2.5, 3.5, 4.5 };
__asm__ volatile
(
"movups %[a], %%xmm0\n\t" // поместить 4 переменные с плавающей точкой из a в регистр xmm0
"movups %[b], %%xmm1\n\t" // поместить 4 переменные с плавающей точкой из b в регистр xmm1
"mulps %%xmm1, %%xmm0\n\t" // перемножить пакеты плавающих точек: xmm0 = xmm0 * xmm1
// xmm00 = xmm00 * xmm10
// xmm01 = xmm01 * xmm11
// xmm02 = xmm02 * xmm12
// xmm03 = xmm03 * xmm13
"movups %%xmm0, %[a]\n\t" // выгрузить результаты из регистра xmm0 по адресам a
:
: [a]"m"(*a), [b]"m"(*b)
: "%xmm0", "%xmm1"
);
См. также
Напишите отзыв о статье "SSE"
Ссылки
- [intel.com Корпорация Intel]
- [www.intel.com/Assets/PDF/manual/253666.pdf Официальное руководство по процессорам Intel, часть 2а] Список инструкций, включаяя SSE, (A-M по лат. алфавиту) приведен в п. 3.2.
- [www.intel.com/Assets/PDF/manual/253667.pdf Официальное руководство по процессорам Intel, часть 2b] Список инструкций, включаяя SSE, (N-Z по лат. алфавиту) приведен в п. 4.2.
|
Отрывок, характеризующий SSE
Странница успокоилась и, наведенная опять на разговор, долго потом рассказывала про отца Амфилохия, который был такой святой жизни, что от ручки его ладоном пахло, и о том, как знакомые ей монахи в последнее ее странствие в Киев дали ей ключи от пещер, и как она, взяв с собой сухарики, двое суток провела в пещерах с угодниками. «Помолюсь одному, почитаю, пойду к другому. Сосну, опять пойду приложусь; и такая, матушка, тишина, благодать такая, что и на свет Божий выходить не хочется».
Пьер внимательно и серьезно слушал ее. Князь Андрей вышел из комнаты. И вслед за ним, оставив божьих людей допивать чай, княжна Марья повела Пьера в гостиную.
– Вы очень добры, – сказала она ему.
– Ах, я право не думал оскорбить ее, я так понимаю и высоко ценю эти чувства!
Княжна Марья молча посмотрела на него и нежно улыбнулась. – Ведь я вас давно знаю и люблю как брата, – сказала она. – Как вы нашли Андрея? – спросила она поспешно, не давая ему времени сказать что нибудь в ответ на ее ласковые слова. – Он очень беспокоит меня. Здоровье его зимой лучше, но прошлой весной рана открылась, и доктор сказал, что он должен ехать лечиться. И нравственно я очень боюсь за него. Он не такой характер как мы, женщины, чтобы выстрадать и выплакать свое горе. Он внутри себя носит его. Нынче он весел и оживлен; но это ваш приезд так подействовал на него: он редко бывает таким. Ежели бы вы могли уговорить его поехать за границу! Ему нужна деятельность, а эта ровная, тихая жизнь губит его. Другие не замечают, а я вижу.
В 10 м часу официанты бросились к крыльцу, заслышав бубенчики подъезжавшего экипажа старого князя. Князь Андрей с Пьером тоже вышли на крыльцо.
– Это кто? – спросил старый князь, вылезая из кареты и угадав Пьера.
– AI очень рад! целуй, – сказал он, узнав, кто был незнакомый молодой человек.
Старый князь был в хорошем духе и обласкал Пьера.
Перед ужином князь Андрей, вернувшись назад в кабинет отца, застал старого князя в горячем споре с Пьером.
Пьер доказывал, что придет время, когда не будет больше войны. Старый князь, подтрунивая, но не сердясь, оспаривал его.
– Кровь из жил выпусти, воды налей, тогда войны не будет. Бабьи бредни, бабьи бредни, – проговорил он, но всё таки ласково потрепал Пьера по плечу, и подошел к столу, у которого князь Андрей, видимо не желая вступать в разговор, перебирал бумаги, привезенные князем из города. Старый князь подошел к нему и стал говорить о делах.
– Предводитель, Ростов граф, половины людей не доставил. Приехал в город, вздумал на обед звать, – я ему такой обед задал… А вот просмотри эту… Ну, брат, – обратился князь Николай Андреич к сыну, хлопая по плечу Пьера, – молодец твой приятель, я его полюбил! Разжигает меня. Другой и умные речи говорит, а слушать не хочется, а он и врет да разжигает меня старика. Ну идите, идите, – сказал он, – может быть приду, за ужином вашим посижу. Опять поспорю. Мою дуру, княжну Марью полюби, – прокричал он Пьеру из двери.
Пьер теперь только, в свой приезд в Лысые Горы, оценил всю силу и прелесть своей дружбы с князем Андреем. Эта прелесть выразилась не столько в его отношениях с ним самим, сколько в отношениях со всеми родными и домашними. Пьер с старым, суровым князем и с кроткой и робкой княжной Марьей, несмотря на то, что он их почти не знал, чувствовал себя сразу старым другом. Они все уже любили его. Не только княжна Марья, подкупленная его кроткими отношениями к странницам, самым лучистым взглядом смотрела на него; но маленький, годовой князь Николай, как звал дед, улыбнулся Пьеру и пошел к нему на руки. Михаил Иваныч, m lle Bourienne с радостными улыбками смотрели на него, когда он разговаривал с старым князем.
Старый князь вышел ужинать: это было очевидно для Пьера. Он был с ним оба дня его пребывания в Лысых Горах чрезвычайно ласков, и велел ему приезжать к себе.
Когда Пьер уехал и сошлись вместе все члены семьи, его стали судить, как это всегда бывает после отъезда нового человека и, как это редко бывает, все говорили про него одно хорошее.