Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

SSE2 ( Streaming SIMD Extensions 2 ) - это один из дополнительных наборов инструкций процессора Intel SIMD (Single Instruction, Multiple Data), впервые представленный Intel с начальной версией Pentium 4 в 2000 году. Он расширяет предыдущий набор инструкций SSE и предназначен для полностью заменить MMX . Intel расширила SSE2, чтобы создать SSE3 в 2004 году. SSE2 добавил 144 новых инструкции к SSE, который содержит 70 инструкций. Конкурирующий чип-производитель AMD добавлена поддержка SSE2 с введением их Opteron и Athlon 64 диапазонов AMD64 64-битные процессоры в 2003 году.

Особенности [ править ]

Большинство инструкций SSE2 реализуют операции с целочисленными векторами, также присутствующие в MMX. Вместо регистров MMX они используют регистры XMM, которые шире и позволяют значительно улучшить производительность в специализированных приложениях. Другим преимуществом замены MMX на SSE2 является избежание штрафа за переключение режима для выдачи инструкций x87, присутствующих в MMX, поскольку он разделяет пространство регистров с x87 FPU. SSE2 также дополняет векторные операции с плавающей запятой набора инструкций SSE, добавляя поддержку типа данных двойной точности.

Другие расширения SSE2 включают в себя набор инструкций управления кешем, предназначенных в первую очередь для минимизации загрязнения кеша при обработке бесконечных потоков информации, и сложное дополнение инструкций преобразования числового формата.

Реализация SSE2 от AMD на платформе AMD64 ( x86-64 ) включает дополнительные восемь регистров, увеличивая их общее количество до 16 (от XMM0 до XMM15). Эти дополнительные регистры видны только при работе в 64-битном режиме. Intel приняла эти дополнительные регистры как часть своей поддержки архитектуры x86-64 (или, говоря языком Intel, «Intel 64») в 2004 году.

Различия между x87 FPU и 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-битном коде,его следует предпочесть почти для всех работ по векторизации.

Использование компилятора [ править ]

Впервые представленный в 2000 году, SSE2 не поддерживался средствами разработки программного обеспечения. Например, чтобы использовать 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 также может генерировать инструкции 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
  • Intel Атом
  • AMD Athlon 64
  • Transmeta Efficeon
  • VIA C7

Следующие процессоры IA-32 были выпущены после разработки SSE2, но не реализовали его:

  • Процессоры AMD до Athlon 64 , такие как Athlon XP
  • ЧЕРЕЗ C3
  • Трансмета Крузо
  • Intel Quark

См. Также [ править ]

  • Инструкции SSE2

Ссылки [ править ]

  1. ^ Матц, Майкл; Губицка, Ян; Джегер, Андреас; Митчелл, Марк (январь 2010 г.). «Двоичный интерфейс приложения System V - Дополнение к процессору архитектуры AMD64 - Проект версии 0.99.4» (PDF) . Проверено 26 апреля 2013 года .
  2. ^ Туман, Агнер. «Оптимизация программного обеспечения на C ++: руководство по оптимизации для платформ Windows, Linux и Mac» (PDF) . Проверено 26 апреля 2013 года .
  3. ^ "Руководство по программированию DirectXMath / Внутренние компоненты библиотеки" .
  4. ^ Корпорация Microsoft. «Что такое PAE, NX и SSE2 и почему мой компьютер должен поддерживать их для работы с Windows 8?» . Архивировано из оригинала на 11 апреля 2013 года . Проверено 19 марта 2013 года .