Потоковые расширения SIMD - Streaming SIMD Extensions

В вычисление, Потоковые расширения SIMD (SSE) - это одна инструкция, несколько данных (SIMD ) Набор инструкций расширение x86 архитектура, разработанная Intel и введены в 1999 г. Pentium III серия из Центральные процессоры (CPU) вскоре после появления Продвинутые Микроустройства (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 изначально назывался Катмай Новые инструкции (KNI), Катмай кодовое название первой ревизии ядра Pentium III. Во время проекта Katmai Intel стремилась отличить его от своей предыдущей линейки продуктов, в частности от своего флагмана. Pentium II. Позже он был переименован Расширения SIMD для потоковой передачи в Интернете (ISSE[1]), затем SSE. В конце концов AMD добавила поддержку инструкций SSE, начиная с Athlon XP и Duron (Ядро Моргана ) процессоры.

Регистры

Первоначально SSE добавила восемь новых 128-битных регистров, известных как XMM0 через XMM7. В AMD64 расширения от AMD (первоначально называвшиеся x86-64) добавил еще восемь регистров XMM8 через XMM15, и это расширение дублируется в Intel 64 архитектура. Также имеется новый 32-битный регистр управления / состояния, MXCSR. Регистры XMM8 через XMM15 доступны только в 64-битном режиме работы.

XMM registers.svg

SSE использовал только один тип данных для регистров XMM:

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 представила как скалярные, так и упакованные инструкции с плавающей запятой.

Инструкции с плавающей точкой

  • Перемещение данных из памяти в регистр / из регистра в память / из регистра в регистр
  • Арифметика
    • Скалярный - 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
  • Другой
    • ПМОВМСКБ, ПШУФВ

Прочие инструкции

  • 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.ш;

Это соответствует четырем инструкциям 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 (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 (MNI) - это обновление SSE3, добавляющее 16 новых инструкций, которые включают перестановку байтов в слове, умножение 16-битных чисел с фиксированной точкой с правильным округлением и инструкции накопления внутри слова. SSSE3 часто ошибочно принимают за SSE4, так как этот термин использовался при разработке ядра. микроархитектура.
  • SSE4, Новые инструкции Penryn (PNI) - еще одно важное усовершенствование, добавляющее инструкцию скалярного произведения, дополнительные целочисленные инструкции, инструкцию popcnt и многое другое.
  • XOP, FMA4 и CVT16 новые итерации объявлены AMD в августе 2007 г.[2][3] и пересмотрен в мае 2009 г.[4]
  • Расширенные векторные расширения (AVX), Новые инструкции Гешера (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 opcode - это дополнительная инструкция процессора (название происходит от 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. ^ а б Дифендорф, Кейт (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. ^ Гиркар, Милинд (1 октября 2013 г.). «Intel® Advanced Vector Extensions (Intel® AVX)». Intel. Получено 24 августа, 2017.
  6. ^ «Загрузите утилиту для идентификации процессоров Intel®». Intel. 24 июля 2017 г.. Получено 24 августа, 2017.

внешняя ссылка