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

В вычислении , 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.

Проблемы с программным и аппаратным обеспечением [ править ]

При использовании всех расширений набора команд 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.

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

  1. ^ a b Дифендорф, Кейт (8 марта 1999 г.). «Pentium III = Pentium II + SSE: архитектура Internet SSE повышает производительность мультимедиа» (PDF) . Отчет микропроцессора . 13 (3) . Проверено 1 сентября 2017 года .
  2. Вэнс, Эшли (3 августа 2007 г.). «AMD планирует однопоточное ускорение с расширениями x86» . Реестр . Проверено 24 августа 2017 года .
  3. ^ «Технология AMD64: 128-битный набор инструкций SSE5» (PDF) . AMD . Август 2007 . Проверено 24 августа 2017 года .
  4. ^ "AMD64 Technology AMD64 Architecture Руководство программиста Том 6: 128-битные и 256-битные инструкции XOP и FMA4" (PDF) . AMD. Ноября 2009 . Проверено 24 августа 2017 года .
  5. ^ Girkar, Milind (1 октября 2013). «Intel® Advanced Vector Extensions (Intel® AVX)» . Intel . Проверено 24 августа 2017 года .
  6. ^ «Загрузите Утилиту идентификации процессоров Intel®» . Intel. 24 июля 2017 года . Проверено 24 августа 2017 года .

Внешние ссылки [ править ]

  • Руководство Intel Intrinsics