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 с выпуском своих линеек Opteron и Athlon 64 64-битных процессоров AMD64 в 2003 году.
В 2004 году SSE2 был расширен, в результате чего был создан SSE3 , а в 2006 году — еще раз, в результате чего был создан SSE4 .
Большинство инструкций SSE2 реализуют целочисленные векторные операции, также имеющиеся в MMX. Вместо регистров MMX они используют регистры XMM, которые шире и позволяют значительно повысить производительность в специализированных приложениях. Еще одним преимуществом замены MMX на SSE2 является избежание штрафа за переключение режима для выдачи инструкций x87, присутствующих в MMX, поскольку он делит пространство регистров с x87 FPU. SSE2 также дополняет векторные операции с плавающей точкой набора инструкций SSE, добавляя поддержку типа данных двойной точности.
Другие расширения SSE2 включают набор инструкций по управлению кэшем, предназначенных в первую очередь для минимизации загрязнения кэша при обработке бесконечных потоков информации, а также сложный набор инструкций по преобразованию числовых форматов.
Реализация AMD SSE2 на платформе AMD64 ( x86-64 ) включает восемь дополнительных регистров, удваивая общее число до 16 (XMM0 через XMM15). Эти дополнительные регистры видны только при работе в 64-битном режиме. Intel приняла эти дополнительные регистры как часть своей поддержки архитектуры x86-64 (или на языке Intel, "Intel 64") в 2004 году.
Инструкции FPU (x87) обеспечивают более высокую точность, вычисляя промежуточные результаты с точностью 80 бит по умолчанию, чтобы минимизировать ошибку округления в численно нестабильных алгоритмах (см. обоснование дизайна IEEE 754 и ссылки в нем). Однако FPU x87 является только скалярным блоком, тогда как SSE2 может обрабатывать небольшой вектор операндов параллельно.
Если код, разработанный для x87, переносится на более низкую точность с плавающей точкой двойной точности SSE2, определенные комбинации математических операций или входных наборов данных могут привести к измеримому числовому отклонению, что может стать проблемой в воспроизводимых научных вычислениях, например, если результаты вычислений необходимо сравнивать с результатами, полученными с другой архитектуры машины. Связанная с этим проблема заключается в том, что исторически языковые стандарты и компиляторы были непоследовательны в своей обработке 80-битных регистров x87, реализующих переменные двойной расширенной точности, по сравнению с форматами двойной и одинарной точности, реализованными в 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++ Processor Pack добавил поддержку 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:
Следующие процессоры IA-32 были выпущены после разработки SSE2, но не реализовали его: