SSE (Streaming SIMD Extensions) было первым из множества одноименных векторных расширений для набора инструкций x86. На этом этапе SSE чаще всего является универсальным средством для векторных инструкций x86 в целом, а не ссылкой на SSE без SSE2, SSE3 и т. Д.

См. Вики- страницу с тегами x86 для получения руководств и других ресурсов по программированию и оптимизации программ с использованием векторных расширений x86.


Руководства по векторному программированию SSE/SIMD, ориентированные на аспект SIMD, а не на общие x86:

  • В руководстве Agner Fog по оптимизации сборки есть глава, посвященная векторам, включая таблицы инструкций по перемещению данных: широковещательные передачи внутри вектора, объединение данных между двумя векторами, различные виды перемешивания и т. Д. Это отлично подходит для поиска правильной инструкции (по внутренней) для данных. движение вам нужно.

  • Обработка чисел с помощью AVX и AVX2: введение с примерами использования встроенных функций C++

  • Слайды + текст: SIMD на Insomniac Games (GDC 2015): введение в SIMD и некоторые конкретные примеры: проверка всех дверей относительно всех персонажей на уровне. Расширенные приемы: фильтрация массива в меньший массив (с использованием левой упаковки на основе маски сравнения) с помощью решения SSSE3 pshufb и решения расстояния перемещения SSE2. Также: создание N-битных масок для переменной для каждого элемента N. Включая умную версию SSE2 на основе числа с плавающей запятой.


Справочные руководства по набору инструкций / встроенным функциям (дополнительные ссылки см. В вики-странице по тегам x86)


Разные специфические вещи:


Основы Streaming SIMD Extensions (SSE)

Вместе различные расширения SSE позволяют работать с векторами 128b, состоящими из элементов типа float, double или integer (от 8b до 64b). Есть инструкции для арифметических, побитовых операций, перемешивания, смешивания (условные перемещения), сравнения и некоторых более специализированных операций (например, SAD для мультимедиа, умножение без переноса для крипто-математики / математики с конечным полем, строкиstrstr()и так далее)). Предоставляется FP sqrt, но, в отличие от FPU x87, функции математической библиотеки, такие какsinдолжен быть реализован программно. SSE для скалярной математики FP заменил x87 с плавающей запятой, теперь, когда аппаратная поддержка почти универсальна.

Для эффективного использования обычно требуется, чтобы программы сохраняли свои данные в виде непрерывных фрагментов, поэтому их можно загружать фрагментами размером 16 байт и использовать без особого перемешивания. SSE не предлагает грузы / магазины с ходу, только упакованные. (SoA против AoS: структуры массивов против массивов структур). Требования к выравниванию операндов памяти также могут быть препятствием, даже несмотря на то, что современное оборудование имеет быструю невыровненную загрузку / сохранение.

Хотя доступно множество инструкций, набор инструкций не очень ортогонален. Нет ничего необычного в том, чтобы найти нужную операцию, но она доступна только для элементов, размер которых отличается от размера, с которым вы работаете. Еще один хороший пример - перемешивание с плавающей запятой (SHUFPS) имеют другую семантику, чем 32b-целочисленные перемешивания (PSHUFD).

Детали

SSE добавил новые архитектурные регистры (xmm0-xmm7, 128b каждый (xmm0-xmm15 в 64-битном режиме)), требующие поддержки ОС для сохранения / восстановления их при переключении контекста. Предыдущие расширения MMX (для целочисленного SIMD) повторно использовали регистры x87 FP.

Intel представила MMX, original-SSE, SSE2, SSE3, SSSE3, SSE4.1 и SSE4.2. XOP от AMD (пересмотр их планов SSE5) никогда не использовался Intel и будет исключен даже в будущих разработках AMD. Война наборов инструкций между Intel и AMD привела ко многим неоптимальным результатам, из-за чего декодерам инструкций в процессорах требуется больше энергии и транзисторов. (И ограничивает возможность дальнейшего расширения).

"SSE" обычно относится ко всему семейству расширений. Написание программ, которые следят за тем, чтобы использовать только инструкции, поддерживаемые машиной, на которой они работают, необходимо и подразумевается, и не стоит загромождать наш язык. (Установка указателей функций - хороший способ определить, что поддерживается, один раз при запуске, избегая перехода для выбора подходящей функции каждый раз, когда она необходима.)

Дальнейших расширений SSE не ожидается: AVX представил новую версию с 3 операндами для всех инструкций SSE, а также некоторые новые функции (в том числе отказ от требований к выравниванию, за исключением перемещений с явным выравниванием, таких какvmovdqa). Дальнейшие векторные расширения будут называться AVX-something, пока Intel не придумает что-то достаточно другое, чтобы снова изменить название.

История

SSE, впервые представленный с Pentium III в 1999 году, стал ответом Intel на расширение AMD 3DNow в 1998 году.

В исходной SSE добавлена ​​векторная математика с плавающей запятой одинарной точности. Целочисленные инструкции для работы с регистрами xmm (вместо 64-битных регистров mmx) не появлялись до SSE2.

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

Большинство ограничений SSE были улучшены с помощью набора инструкций SSE2, единственное заметное ограничение, оставшееся на сегодняшний день, - это отсутствие горизонтального сложения или операции скалярного произведения как эффективным, так и широко доступным способом. Хотя в SSE3 и SSE4.1 добавлены инструкции горизонтального добавления и точечного произведения, они обычно медленнее, чем ручное перемешивание + добавление. Используйте их только в конце цикла.

Отсутствие поддержки между производителями затрудняло разработку программного обеспечения с помощью SSE в первые годы. С внедрением AMD SSE2 в свои 64-битные процессоры в 2003/2004 годах эта проблема постепенно исчезла. На сегодняшний день процессоров без поддержки SSE/SSE2 практически не существует. SSE2 является частью x86-64 baseline, с вдвое большим количеством векторных регистров, доступных в 64-битном режиме.