Эта статья требует дополнительных ссылок для проверки . ( июнь 2014 г. ) ( Узнайте, как и когда удалить это сообщение-шаблон ) |
В вычислении , Streaming SIMD Extensions ( SSE ) является одна команда, несколько данных ( SIMD ) набор команд расширения для x86 архитектуры, разработанной корпорацией Intel и введена в 1999 году в их Pentium III серии блоков обработки Центральной (CPU) вскоре после появления от Advanced Micro Devices (AMD) в 3DNow! . SSE содержит 70 новых инструкций, большинство из которых работают с числами одинарной точности с плавающей запятой.данные. Команды SIMD могут значительно повысить производительность, когда одни и те же операции должны выполняться с несколькими объектами данных. Типичные области применения - цифровая обработка сигналов и обработка графики .
Первой разработкой Intel IA-32 SIMD был набор инструкций MMX . MMX имел две основные проблемы: он повторно использовал существующие регистры с плавающей запятой x87, что делало процессоры неспособными работать как с данными с плавающей запятой, так и с данными SIMD одновременно, и он работал только с целыми числами . Команды SSE с плавающей запятой работают с новым независимым набором регистров, регистрами XMM, и добавляют несколько целочисленных инструкций, которые работают с регистрами MMX.
Впоследствии Intel расширила SSE до 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 [1] ), затем в SSE. В конце концов AMD добавила поддержку инструкций SSE, начиная с процессоров Athlon XP и Duron ( ядро Morgan ).
Регистры [ править ]
Первоначально SSE добавил восемь новых 128-битных регистров, известных как XMM0
сквозные XMM7
. В AMD64 расширения от AMD (первоначально называлось x86-64 ) добавили еще восемь регистров 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). [1] В то время как скомпилированное приложение может чередовать инструкции 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 . х = v1 . х + v2 . х ; vec_res . у = v1 . у + v2 . у ; vec_res . z = v1 . z + v2 . z ; vec_res . ш = v1 . ш + 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 New Instructions (WNI), представленный в Pentium 4 , является серьезным усовершенствованием SSE. SSE2 добавляет две основные функции: операции с плавающей запятой двойной точности (64-битные) для всех операций SSE и целочисленные операции MMX над 128-битными регистрами XMM. В исходном наборе команд SSE преобразование в целые числа и обратно помещало целочисленные данные в 64-битные регистры MMX. SSE2 позволяет программисту выполнять математические вычисления SIMD для любого типа данных (от 8-битных целых до 64-битных чисел с плавающей запятой) полностью с помощью файла векторных регистров XMM, без необходимости использовать устаревшие регистры MMX или FPU. Он предлагает ортогональный набор инструкций для работы с общими типами данных.
- SSE3 , также называемый Prescott New Instructions (PNI), представляет собой постепенное обновление до SSE2, добавляя несколько математических инструкций, ориентированных на DSP, и некоторые инструкции по управлению процессами (потоками). Это также позволяло складывать или умножать два числа, хранящихся в одном регистре, что было невозможно в SSE2 и ранее. Эта возможность, известная в терминологии Intel как горизонтальная, была основным дополнением к набору инструкций SSE3. AMD 3Dnow! extension может сделать и последнее.
- SSSE3 , Merom New Instructions (MNI), представляет собой обновление SSE3, добавляющее 16 новых инструкций, которые включают перестановку байтов в слове, умножение 16-битных чисел с фиксированной запятой с правильным округлением и инструкции накопления внутри слова. SSSE3 часто ошибочно принимают за SSE4, поскольку этот термин использовался при разработке микроархитектуры Core .
- SSE4 , новые инструкции Penryn (PNI) - еще одно важное усовершенствование, добавляющее инструкцию скалярного произведения, дополнительные целочисленные инструкции, инструкцию popcnt [ требуется пояснение ] и многое другое.
- XOP , FMA4 и CVT16 - это новые версии, анонсированные AMD в августе 2007 г. [2] [3] и пересмотренные в мае 2009 г. [4]
- Advanced Vector Extensions (AVX), Gesher New Instructions (GNI), представляет собой расширенную версию SSE, анонсированную Intel, с расширенным трактом данных с 128 бит до 256 бит и инструкциями с 3 операндами (вместо 2). Intel выпустила процессоры с поддержкой AVX в начале 2011 года. [5]
- AVX2 - это расширение набора инструкций AVX.
- AVX-512 (3.1 и 3.2) - это 512-битные расширения 256-битных инструкций SIMD Advanced Vector Extensions для архитектуры набора команд x86.
Проблемы с программным и аппаратным обеспечением [ править ]
В этом разделе не процитировать любые источники . Февраль 2021 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) ( |
При использовании всех расширений набора команд x86 BIOS , операционная система и прикладной программист должны проверить и определить их наличие и правильную работу.
- Intel и AMD предлагают приложения для определения того, какие расширения поддерживает процессор.
- Код операции CPUID - это дополнительная инструкция процессора (название происходит от CPU IDentification) для архитектуры x86. Он был представлен Intel в 1993 году, когда представила процессоры Pentium и SL-Enhanced 486.
Освоение расширений x86 в приложениях пользователей было медленным, и даже минимальная базовая поддержка MMX и SSE (в некоторых случаях) отсутствовала в приложениях примерно через 10 лет после того, как эти расширения стали общедоступными. Распределенные вычисления ускорили использование этих расширений в научном сообществе, и многие научные приложения отказываются работать, если ЦП не поддерживает SSE2 или SSE3.
Использование нескольких версий приложения для работы с множеством различных наборов доступных расширений - самый простой способ решить проблему оптимизации расширений x86. Программные библиотеки и некоторые приложения начали поддерживать несколько типов расширений, намекая, что полное использование доступных инструкций x86 может, наконец, стать обычным явлением через 5-15 лет после того, как инструкции были первоначально введены.
Идентификация [ править ]
Следующие программы можно использовать, чтобы определить, какие версии SSE поддерживаются системой.
- Утилита идентификации процессоров Intel [6]
- CPU-Z - утилита для идентификации процессора, материнской платы и памяти.
- lscpu - предоставляется пакетом util-linux в большинстве дистрибутивов GNU / Linux.
Ссылки [ править ]
- ^ a b Дифендорф, Кейт (8 марта 1999 г.). «Pentium III = Pentium II + SSE: архитектура Internet SSE повышает производительность мультимедиа» (PDF) . Отчет микропроцессора . 13 (3) . Проверено 1 сентября 2017 года .
- ↑ Вэнс, Эшли (3 августа 2007 г.). «AMD планирует однопоточное ускорение с расширениями x86» . Реестр . Проверено 24 августа 2017 года .
- ^ «Технология AMD64: 128-битный набор инструкций SSE5» (PDF) . AMD . Август 2007 . Проверено 24 августа 2017 года .
- ^ "AMD64 Technology AMD64 Architecture Руководство программиста Том 6: 128-битные и 256-битные инструкции XOP и FMA4" (PDF) . AMD. Ноября 2009 . Проверено 24 августа 2017 года .
- ^ Girkar, Milind (1 октября 2013). «Intel® Advanced Vector Extensions (Intel® AVX)» . Intel . Проверено 24 августа 2017 года .
- ^ «Загрузите Утилиту идентификации процессоров Intel®» . Intel. 24 июля 2017 года . Проверено 24 августа 2017 года .
Внешние ссылки [ править ]
- Руководство Intel Intrinsics