SSE2
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
SSE2 ( Streaming SIMD Extensions 2 ) — это один из Intel SIMD (Single Instruction, Multiple Data), дополнительных наборов инструкций процессора представленный Intel в начальной версии Pentium 4 в 2000 году. Инструкции SSE2 позволяют использовать регистры XMM (SIMD) на Процессоры с архитектурой набора команд x86. Эти регистры могут загружать до 128 бит данных и одновременно выполнять такие инструкции, как сложение и умножение векторов.
В SSE2 были представлены инструкции с плавающей запятой двойной точности в дополнение к инструкциям с плавающей запятой одинарной точности и целочисленным инструкциям, найденным в SSE. SSE2 расширяет более ранний набор инструкций SSE, добавляя 144 новых инструкции к предыдущим 70 инструкциям. SSE2 намерен полностью заменить MMX — набор инструкций SIMD, присутствующий в процессорах с архитектурой IA-32. Конкурирующий производитель чипов AMD добавил поддержку SSE2, представив в 2003 году линейки Opteron и Athlon 64 с AMD64 64-разрядными процессорами .
SSE2 был расширен до SSE3 в 2004 году и еще раз расширен до SSE4 в 2006 году.
Функции
[ редактировать ]Большинство инструкций SSE2 реализуют операции с целочисленными векторами, которые также присутствуют в MMX. Вместо регистров MMX используются регистры XMM, которые более широки и позволяют значительно повысить производительность в специализированных приложениях. Еще одним преимуществом замены MMX на SSE2 является отсутствие штрафа за переключение режима при выдаче инструкций x87, присутствующих в MMX, поскольку он совместно использует пространство регистров с FPU x87. SSE2 также дополняет векторные операции с плавающей запятой набора инструкций SSE, добавляя поддержку типа данных двойной точности.
Другие расширения SSE2 включают набор инструкций управления кэшем, предназначенных в первую очередь для минимизации загрязнения кэша при обработке бесконечных потоков информации, а также сложное дополнение инструкций преобразования числового формата.
Реализация AMD SSE2 на платформе AMD64 ( x86-64 ) включает дополнительные восемь регистров, что удваивает общее число до 16 (от XMM0 до XMM15). Эти дополнительные регистры видны только при работе в 64-битном режиме. Intel приняла эти дополнительные регистры в рамках поддержки архитектуры x86-64 (или, на языке Intel, «Intel 64») в 2004 году.
Различия между FPU x87 и SSE2
[ редактировать ]Инструкции FPU (x87) обеспечивают более высокую точность за счет вычисления промежуточных результатов с точностью 80 бит по умолчанию, чтобы минимизировать ошибку округления в численно нестабильных алгоритмах (см. обоснование конструкции IEEE 754 и ссылки в нем). Однако FPU x87 является только скалярным блоком, тогда как SSE2 может параллельно обрабатывать небольшой вектор операндов.
Если код, разработанный для x87, перенесен на более низкую точность с плавающей запятой SSE2 двойной точности, определенные комбинации математических операций или входных наборов данных могут привести к измеримому числовому отклонению, которое может стать проблемой в воспроизводимых научных вычислениях, например, если результаты вычислений необходимо сравнивать. против результатов, полученных на другой архитектуре машины. Связанная с этим проблема заключается в том, что исторически стандарты языка и компиляторы непоследовательно обрабатывали 80-битные регистры x87, реализующие переменные двойной расширенной точности, по сравнению с форматами двойной и одинарной точности, реализованными в SSE2: округление промежуточных значений повышенной точности. для переменных двойной точности не был полностью определен и зависел от деталей реализации, например, от того, когда регистры были перенесены в память.
Различия между MMX и SSE2
[ редактировать ]SSE2 расширяет инструкции MMX для работы с регистрами XMM. Таким образом, можно преобразовать весь существующий код MMX в эквивалент SSE2. Поскольку регистр SSE2 в два раза длиннее регистра MMX, для этого может потребоваться изменить счетчики циклов и доступ к памяти. Однако доступна загрузка и сохранение 8-байтовых данных в XMM, поэтому это не является строго обязательным.
Хотя одна инструкция SSE2 может обрабатывать вдвое больше данных, чем инструкция MMX, производительность может незначительно увеличиться. Две основные причины: доступ к данным SSE2 в памяти, не выровненным по границе 16 байт, может повлечь за собой значительные потери, а пропускная способность инструкций SSE2 в старых реализациях x86 была вдвое меньше, чем у инструкций MMX. Intel инструкцию решила первую проблему, добавив в SSE3 для уменьшения накладных расходов на доступ к невыровненным данным и повышения общей производительности невыровненных загрузок, а последнюю проблему - расширив механизм выполнения в микроархитектуре Core в Core 2 Duo и более поздних продуктах.
Поскольку файлы регистрации MMX и x87 являются псевдонимами друг друга, использование MMX не позволит инструкциям x87 работать должным образом. После использования MMX программист должен использовать инструкцию emms (C: _mm_empty()), чтобы восстановить работу файла регистров x87. В некоторых операционных системах x87 используется не очень часто, но все же может использоваться в некоторых критических областях, таких как pow(), где необходима дополнительная точность. В таких случаях поврежденное состояние с плавающей запятой, вызванное неспособностью выдать emms, может остаться незамеченным в течение миллионов инструкций, прежде чем в конечном итоге привести к сбою процедуры с плавающей запятой и возврату NaN. Поскольку проблема не проявляется локально в коде MMX, поиск и исправление ошибки может занять очень много времени. Поскольку SSE2 не имеет этой проблемы и обычно обеспечивает гораздо лучшую пропускную способность и предоставляет больше регистров в 64-битном коде, его следует отдавать предпочтение практически для всех работ по векторизации.
Использование компилятора
[ редактировать ]Когда SSE2 был представлен в 2000 году, он не поддерживался инструментами разработки программного обеспечения. Например, чтобы использовать SSE2 в проекте Microsoft Visual Studio , программисту приходилось либо вручную писать встроенную ассемблер, либо импортировать объектный код из внешнего источника. Позже пакет процессоров Visual C++ добавил поддержку SSE2 в Visual C++ и MASM .
Компилятор Intel C++ может автоматически генерировать код SSE4 , SSSE3 , SSE3 , SSE2 и SSE без использования ассемблера, написанного вручную.
Начиная с GCC 3, GCC может автоматически генерировать скалярный код SSE/SSE2, если цель поддерживает эти инструкции. Автоматическая векторизация для SSE/SSE2 была добавлена начиная с GCC 4.
Пакет Sun Studio Compiler Suite также может генерировать инструкции SSE2, если используется флаг компилятора -xvector=simd.
Начиная с Microsoft Visual C++ 2012, опция компилятора для создания инструкций SSE2 включена по умолчанию.
Поддержка ЦП
[ редактировать ]SSE2 — это расширение архитектуры IA-32 , основанное на наборе команд x86 . Таким образом, только процессоры x86 могут включать SSE2. Архитектура AMD64 поддерживает IA-32 в качестве режима совместимости и включает SSE2 в свою спецификацию. [1] [2] Это также удваивает количество регистров XMM, обеспечивая лучшую производительность. SSE2 также является обязательным условием для установки Windows 8. [3] (и более поздних версий) или Microsoft Office 2013 (и более поздних версий) «для повышения надежности сторонних приложений и драйверов, работающих в Windows 8». [4]
Следующие процессоры IA-32 поддерживают SSE2:
- Intel NetBurst Процессоры на базе ( Pentium 4 , Xeon , Celeron , Pentium D , Celeron D )
- Intel Pentium M и Celeron M
- Интел Атом
- AMD Атлон 64
- Эффективность передачи
- ВИА С7
Следующие процессоры IA-32 были выпущены после разработки SSE2, но не реализовали его:
- Процессоры AMD до Athlon 64 , например Athlon XP
- ВИА С3
- Трансмутационный Крузо
- Интел Кварк
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Мац, Майкл; Губичка, Ян; Йегер, Андреас; Митчелл, Марк (январь 2010 г.). «Двоичный интерфейс приложения System V — дополнение к процессору с архитектурой AMD64 — черновая версия 0.99.4» (PDF) . Проверено 26 апреля 2013 г. [ постоянная мертвая ссылка ]
- ^ Туман, Агнер. «Оптимизация программного обеспечения на C++: руководство по оптимизации для платформ Windows, Linux и Mac» (PDF) . Архивировано (PDF) из оригинала 8 апреля 2013 г. Проверено 26 апреля 2013 г.
- ^ «Руководство по программированию DirectXMath/Внутреннее устройство библиотеки» . Архивировано из оригинала 2 июля 2019 года . Проверено 2 июля 2019 г.
- ^ Корпорация Майкрософт. «Что такое PAE, NX и SSE2 и почему мой компьютер должен их поддерживать для запуска Windows 8?» . Архивировано из оригинала 11 апреля 2013 года . Проверено 19 марта 2013 г.