Потоковые SIMD-расширения
Эта статья нуждается в дополнительных цитатах для проверки . ( июнь 2014 г. ) |
В вычислительной сфере Streaming SIMD Extensions ( SSE одной инструкции, нескольких данных ( SIMD ) ) — это расширение набора команд для архитектуры x86 , разработанное Intel и представленное в 1999 году в (ЦП) Pentium III серии центральных процессоров вскоре после появления передовых микроустройств (AMD) 3DNow! . SSE содержит 70 новых инструкций (65 уникальных мнемоник). [1] используя 70 кодировок), большинство из которых работают с одинарной точности с плавающей запятой данными . Инструкции SIMD могут значительно повысить производительность, когда одни и те же операции необходимо выполнить с несколькими объектами данных. Типичными приложениями являются цифровая обработка сигналов и обработка графики .
Первой разработкой Intel IA-32 SIMD был набор инструкций MMX . У MMX было две основные проблемы: он повторно использовал существующие регистры x87 с плавающей запятой, из-за чего процессоры не могли одновременно работать как с данными с плавающей запятой, так и с SIMD, и работал только с целыми числами . Инструкции SSE с плавающей запятой работают с новым независимым набором регистров, регистрами XMM, и добавляют несколько целочисленных инструкций, которые работают с регистрами MMX.
Впоследствии SSE был расширен Intel до SSE2 , SSE3 , SSSE3 и SSE4 . Поскольку он поддерживает математические вычисления с плавающей запятой, он имел более широкое применение, чем MMX, и стал более популярным. Добавление поддержки целых чисел в SSE2 сделало MMX в значительной степени ненужным, хотя в некоторых ситуациях можно добиться дальнейшего повышения производительности. [ когда? ] используя MMX параллельно с операциями SSE.
Первоначально SSE назывался Katmai New Instructions ( KNI ), причем Katmai — кодовое название первой версии ядра Pentium III. Во время проекта Katmai Intel стремилась отличить его от своей более ранней линейки продуктов, особенно от своего флагманского Pentium II . Позже он был переименован в Internet Streaming SIMD Extensions ( ISSE). [2] ), затем ССЕ.
AMD добавила подмножество SSE, 19 из них называются новыми инструкциями MMX. [3] и известный как несколько вариантов и комбинаций SSE и MMX, вскоре после выпуска оригинального Athlon в августе 1999 года, см. 3DNow! расширения . В конечном итоге AMD добавила полную поддержку инструкций SSE, начиная со своих процессоров Athlon XP и Duron ( ядро Morgan ).
Регистры [ править ]
Первоначально в SSE было добавлено восемь новых 128-битных регистров, известных как XMM0
через XMM7
. Расширения AMD64 x86-64 от AMD (первоначально называвшиеся . ) добавили еще восемь регистров XMM8
через XMM15
, и это расширение дублируется в архитектуре Intel 64 . Также имеется новый 32-битный регистр управления/состояния. MXCSR
. Регистры XMM8
через XMM15
доступны только в 64-битном режиме работы.

SSE использовал только один тип данных для регистров XMM:
- четыре 32-битных числа одинарной точности с плавающей запятой
Позже SSE2 расширит использование регистров XMM, включив в него:
- два 64-битных числа двойной точности с плавающей запятой или
- два 64-битных целых числа или
- четыре 32-битных целых числа или
- восемь 16-битных коротких целых чисел или
- шестнадцать 8-битных байтов или символов.
Поскольку эти 128-битные регистры представляют собой дополнительные состояния машины, которые операционная система должна сохранять при переключении задач , они по умолчанию отключены до тех пор, пока операционная система явно не включит их. Это означает, что ОС должна знать, как использовать FXSAVE
и FXRSTOR
инструкции, которые представляют собой расширенную пару инструкций, которые могут x86 одновременно сохранять все состояния регистров и SSE. Эта поддержка была быстро добавлена во все основные операционные системы IA-32.
Первый процессор, поддерживающий SSE, Pentium III , разделял ресурсы выполнения между SSE и модулем с плавающей запятой (FPU). [2] Хотя скомпилированное приложение может чередовать инструкции FPU и SSE бок о бок, Pentium III не будет выдавать инструкции FPU и SSE в одном и том же такте . Это ограничение снижает эффективность конвейерной обработки , но отдельные регистры XMM позволяют смешивать SIMD и скалярные операции с плавающей запятой без снижения производительности из-за явного переключения режима MMX/с плавающей запятой.
Инструкции SSE [ править ]
SSE представила как скалярные , так и упакованные инструкции с плавающей запятой.
Инструкции с плавающей запятой [ править ]
- Перемещение данных из памяти в регистр/регистра в память/регистра в регистр
- Скаляр –
MOVSS
- Упакованный –
MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS, MOVMSKPS
- Скаляр –
- Арифметика
- Скаляр –
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
Пример [ править ]
Следующий простой пример демонстрирует преимущество использования SSE. Рассмотрим такую операцию, как сложение векторов, которая очень часто используется в приложениях компьютерной графики. Чтобы сложить два четырехкомпонентных вектора одинарной точности с использованием x86, требуются четыре инструкции сложения с плавающей запятой.
vec_res.x = v1.x + v2.x;
vec_res.y = v1.y + v2.y;
vec_res.z = v1.z + v2.z;
vec_res.w = v1.w + v2.w;
Это соответствует четырем инструкциям x86 FADD в объектном коде. С другой стороны, как показывает следующий псевдокод, одна 128-битная инструкция «упакованного сложения» может заменить четыре инструкции скалярного сложения.
movaps xmm0, [v1] ;xmm0 = v1.w | v1.z | v1.y | v1.x
addps xmm0, [v2] ;xmm0 = v1.w+v2.w | v1.z+v2.z | v1.y+v2.y | v1.x+v2.x
movaps [vec_res], xmm0 ;xmm0
Более поздние версии [ править ]
- SSE2 , Новые инструкции Willamette (WNI), представленные в Pentium 4 , представляют собой значительное усовершенствование SSE. В SSE2 добавлены две основные функции: операции с плавающей запятой двойной точности (64 бита) для всех операций SSE и целочисленные операции MMX над 128-битными регистрами XMM. В исходном наборе инструкций SSE преобразование в целые числа и обратно помещало целочисленные данные в 64-битные регистры MMX. SSE2 позволяет программисту выполнять математические операции SIMD с любым типом данных (от 8-битного целого числа до 64-битного числа с плавающей запятой) полностью с помощью файла векторных регистров XMM без необходимости использования устаревших регистров MMX или FPU. Он предлагает ортогональный набор инструкций для работы с распространенными типами данных.
- SSE3 , также называемый новыми инструкциями Prescott (PNI), представляет собой постепенное обновление SSE2, добавляющее несколько математических инструкций, ориентированных на DSP, и некоторые инструкции по управлению процессами (потоками). Это также позволяло складывать или умножать два числа, хранящихся в одном регистре, что было невозможно в SSE2 и более ранних версиях. Эта возможность, известная в терминологии Intel как горизонтальная, стала основным дополнением к набору инструкций SSE3. AMD 3DNow! расширение тоже может сделать последнее.
- SSSE3 , Merom New Instructions (MNI), представляет собой обновление SSE3, добавляющее 16 новых инструкций, которые включают перестановку байтов в слове, умножение 16-битных чисел с фиксированной точкой с правильным округлением и инструкции накопления внутри слова. SSSE3 часто путают с SSE4, поскольку этот термин использовался во время разработки микроархитектуры Core .
- SSE4 , новые инструкции Penryn (PNI), — еще одно важное усовершенствование, добавляющее инструкцию скалярного произведения , дополнительные целочисленные инструкции,
popcnt
инструкция ( подсчет населения : подсчет количества битов, установленных в 1, широко используется, например, в криптографии ) и многое другое. - XOP , FMA4 и CVT16 — новые версии, анонсированные AMD в августе 2007 года. [4] [5] и пересмотрено в мае 2009 г. [6]
- Advanced Vector Extensions (AVX), Gesher New Instructions (GNI), представляет собой расширенную версию SSE, анонсированную Intel, с расширенным каналом данных со 128 бит до 256 бит и инструкциями с 3 операндами (вместо 2). Intel выпустила процессоры в начале 2011 года с поддержкой AVX. [7]
- AVX2 — это расширение набора инструкций AVX.
- AVX-512 (3.1 и 3.2) — это 512-битные расширения 256-битных инструкций SIMD Advanced Vector Extensions для архитектуры набора команд x86.
Идентификация [ править ]
Следующие программы можно использовать для определения того, какие версии SSE поддерживаются в системе (если таковые имеются).
- Утилита идентификации процессоров Intel [8]
- CPU-Z — утилита идентификации процессора, материнской платы и памяти.
- lscpu — предоставляется пакетом util-linux в большинстве дистрибутивов Linux.
Ссылки [ править ]
- ^ «Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 1: Базовая архитектура» . Интел. Апрель 2022 г. стр. 5-16–5-19. Архивировано из оригинала 25 апреля 2022 года . Проверено 16 мая 2022 г.
- ↑ Перейти обратно: Перейти обратно: а б Дифендорф, Кейт (8 марта 1999 г.). «Pentium III = Pentium II + SSE: архитектура SSE в Интернете повышает производительность мультимедиа» (PDF) . Отчет микропроцессора . 13 (3). Архивировано (PDF) из оригинала 17 апреля 2018 г. Проверено 1 сентября 2017 г.
- ^ «Расширения AMD к руководству по наборам инструкций 3DNow и MMX» (PDF) . Advanced Micro Devices, Inc. , март 2000 г. Архивировано из оригинала (PDF) 17 мая 2008 г. . Проверено 18 апреля 2024 г.
- ^ Вэнс, Эшли (3 августа 2007 г.). «AMD планирует однопоточное ускорение с помощью расширений x86» . Регистр . Архивировано из оригинала 27 апреля 2011 года . Проверено 24 августа 2017 г.
- ^ «Технология AMD64: 128-битный набор инструкций SSE5» (PDF) . АМД . Август 2007 г. Архивировано (PDF) из оригинала 25 августа 2017 г. . Проверено 24 августа 2017 г.
- ^ «Технология AMD64. Руководство программиста по архитектуре AMD64, том 6: 128-битные и 256-битные инструкции XOP и FMA4» (PDF) . АМД. Ноябрь 2009 г. Архивировано (PDF) из оригинала 31 января 2017 г. . Проверено 24 августа 2017 г.
- ^ Гиркар, Милинд (1 октября 2013 г.). «Расширенные векторные расширения Intel® (Intel® AVX)» . Интел . Архивировано из оригинала 25 августа 2017 года . Проверено 24 августа 2017 г.
- ^ «Загрузите утилиту идентификации процессоров Intel®» . Интел. 24 июля 2017 года. Архивировано из оригинала 25 августа 2017 года . Проверено 24 августа 2017 г.
Внешние ссылки [ править ]