SSE2

редактировать

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

Содержание

  • 1 Возможности
  • 2 Различия между x87 FPU и SSE2
  • 3 Различия между MMX и SSE2
  • 4 Использование компилятора
  • 5 Поддержка ЦП
  • 6 См. Также
  • 7 Ссылки

Возможности

Большинство инструкций SSE2 реализуют операции с целочисленными векторами, также найденные в MMX. Вместо регистров MMX они используют регистры XMM, которые шире и позволяют значительно улучшить производительность в специализированных приложениях. Другим преимуществом замены MMX на SSE2 является избежание штрафа за переключение режима для выдачи инструкций x87, присутствующих в MMX, поскольку он разделяет пространство регистров с FPU x87. 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 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 ++ Compiler может автоматически генерировать 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 в свою спецификацию. Он также удваивает количество регистров XMM, обеспечивая лучшую производительность. SSE2 также является требованием для установки Windows 8 (и новее) или Microsoft Office 2013 (и новее) «для повышения надежности сторонних приложений и драйверов, работающих в Windows 8».

Следующий IA-32 ЦП поддерживают SSE2:

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

См. Также

Ссылки

Последняя правка сделана 2021-06-06 04:41:12
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте