Описание тега sse
См. Вики- страницу с тегами x86 для получения руководств и других ресурсов по программированию и оптимизации программ с использованием векторных расширений x86.
Руководства по векторному программированию SSE/SIMD, ориентированные на аспект SIMD, а не на общие x86:
В руководстве Agner Fog по оптимизации сборки есть глава, посвященная векторам, включая таблицы инструкций по перемещению данных: широковещательные передачи внутри вектора, объединение данных между двумя векторами, различные виды перемешивания и т. Д. Это отлично подходит для поиска правильной инструкции (по внутренней) для данных. движение вам нужно.
Обработка чисел с помощью AVX и AVX2: введение с примерами использования встроенных функций C++
Слайды + текст: SIMD на Insomniac Games (GDC 2015): введение в SIMD и некоторые конкретные примеры: проверка всех дверей относительно всех персонажей на уровне. Расширенные приемы: фильтрация массива в меньший массив (с использованием левой упаковки на основе маски сравнения) с помощью решения SSSE3 pshufb и решения расстояния перемещения SSE2. Также: создание N-битных масок для переменной для каждого элемента N. Включая умную версию SSE2 на основе числа с плавающей запятой.
Справочные руководства по набору инструкций / встроенным функциям (дополнительные ссылки см. В вики-странице по тегам x86)
Поиск / поиск векторных встроенных функций Intel (очень хорошо): поиск по мнемонике asm или внутреннему имени C. Фильтр по типу и / или по семейству расширений набора команд (например, исключить AVX512 и более поздние версии). Иногда глючит, особенно. информация о производительности. (Посмотрите таблицы Агнера Фога для получения информации о производительности, хотя в них тоже есть случайные ошибки или опечатки).
Руководства Intel, включая справочное руководство по набору инструкций. Очень подробное описание того, что делает каждая инструкция, с использованием псевдокода. Эти руководства гораздо чаще точны, чем руководства по внутренним функциям.
Список инструкций SIMD для x86/x64 (от SSE до AVX512) Бета: хорошая компактная таблица с мнемоникой инструкций и их встроенными функциями, с разбивкой по типу и размеру элемента. Подробные страницы с графическими диаграммами движения данных для каждой инструкции.
Разные специфические вещи:
Перемешивание по маске с Intel AVX объясняет, как перемешать векторы управления и
_MM_SHUFFLE
работа, в том числе въезд в полосу движения или пересечение полосы движения для AVX.Каковы лучшие последовательности инструкций для генерации векторных констант на лету?. В C/C++ почти всегда предпочитают
_mm_set
или_mm_set1
для инициализации локальных переменных (не глобальных), а не для определения массивов и загрузки из них.напечатайте переменную __m128i: как безопасно и переносимо получить доступ к элементам вектора и как их отладить и распечатать.
Основы 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-битном режиме.