Различные версии mmx, sse и avx дополняют друг друга или дополняют друг друга?

Думаю, мне стоит ознакомиться с расширениями SIMD для x86. Но еще до того, как я начал, я столкнулся с проблемой. Я не могу найти хорошего обзора, какие из них все еще актуальны.

Архитектура x86 за десятилетия накопила множество математических / мультимедийных расширений:

  • MMX
  • 3DNow!
  • SSE
  • SSE2
  • SSE3
  • SSSE3
  • SSE4
  • AVX
  • AVX2
  • AVX512
  • Я что-то забыл?

Являются ли новые надсеты старыми и наоборот? Или они дополняют друг друга?

Некоторые из них устарели? Какие из них по-прежнему актуальны? Я слышал упоминания о «устаревшей SSE».

Некоторые из них исключают друг друга? Т.е. у них одни и те же аппаратные части?

Что мне следует использовать вместе, чтобы максимально использовать оборудование на современных процессорах Intel / AMD? Для аргументации предположим, что я смогу найти подходящее применение этим инструкциям ... обогреть свой дом с помощью процессора, если ничего другого.


person snoukkis    schedule 18.07.2015    source источник
comment
В верхней части моей головы: ни один из них не является устаревшим; SSE - это серия, как и AVX; смешивать SSE и AVX - не лучшая идея. Я уверен, что Википедия или официальные документы могут разрешить детали.   -  person Jeff Hammond    schedule 18.07.2015
comment
@Jeff 3DNow! устарела   -  person harold    schedule 18.07.2015
comment
да, вы забыли SSE4a и XOP.   -  person Z boson    schedule 20.07.2015
comment
Кто-то может возразить, что выровненные инструкции загрузки устарели. Нет причин использовать их со времен Nehalem, по крайней мере, на бумаге.   -  person Z boson    schedule 20.07.2015


Ответы (2)


Недавно я обновил вики-страницы тегов для SSE, AVX и x86SSE2, avx2). Они охватывают многое из этого. tl; dr резюме: AVX объединяет все предыдущие версии SSE и предоставляет версии этих инструкций с тремя операндами. Также 256b версии большинства файловых систем FP (AVX) и int (AVX2).

Краткое описание различных версий SSE см. В Википедии или в более подробном ответе knm241.

Мы действительно не думаем, что это сделает SSE устаревшим. Скорее, воспринимайте AVX как новую и лучшую версию тех же старых инструкций SSE. Они все еще находятся в справочном руководстве под их именами, не относящимися к AVX (например, PSHUFB, а не VPSHUFB). Вы можете смешивать код AVX и SSE, если используете VZEROUPPER, когда это необходимо, чтобы избежать проблем с производительностью из-за смешивания VEX с не-AVX. -VEX insns (на Intel). Таким образом, есть некоторая неприятность при работе со случаями, когда вам нужно вызывать библиотеки, которые могут запускать инструкции SSE, отличные от VEX, или когда ваш код использует математику SSE FP, но также имеет некоторый код AVX, который должен запускаться только в том случае, если процессор поддерживает его.

Если бы совместимость с ЦП не была проблемой, устаревшие версии векторных инструкций SSE были бы действительно устаревшими, как сейчас MMX. AVX / AVX2, по крайней мере, немного лучше во всех смыслах, если считать версию 128b с кодировкой VEX как AVX, а не SSE. Иногда вы все равно используете регистры 128b, потому что ваши данные поступают только такими большими кусками, но чаще работаете с регистрами 256b, чтобы выполнить ту же операцию с вдвое большим объемом данных за раз.

Команды SSE / AVX / x87-FP / integer все используют одни и те же порты выполнения. Смешивая их, вы не сможете сделать больше параллельно. (кроме Haswell, где один из 4 портов ALU может обрабатывать только не-векторные insns, такие как GP reg ops и branch).

person Peter Cordes    schedule 18.07.2015
comment
Хм, knm241 и Питер Кордес, у вас обоих очень хорошие ответы, которые дополняют друг друга. Хотите объединить информацию? Спасибо вам обоим! - person snoukkis; 19.07.2015
comment
Я отмечу этот ответ правильным, потому что он короче, поэтому другой ответ будет виден после этого. - person snoukkis; 19.07.2015
comment
Я просто собираюсь сослаться на ответ knm во втором абзаце. Я хочу, чтобы мой ответ был как можно короче, чтобы он был точным. Список того, что было в каждой версии SSE, доступен в другом месте. Возможно, не так хорошо резюмировано, как ответ knm241. Я действительно добавил параграф о том, что, если бы совместимость ЦП не была проблемой, мы действительно никогда не использовали бы кодирование векторных инструкций без VEX в новом коде. Я думаю, что кодировка VEX иногда на 1 байт длиннее, но обычно это не так. Единственная причина не делать этого - избегать vzeroupper при вызове кода SSE, который нельзя перекомпилировать / собрать. - person Peter Cordes; 19.07.2015
comment
спасибо, этот абзац прояснил вопрос об устаревании - person snoukkis; 19.07.2015

Они дополняют друг друга.

Каждое новое расширение набора команд добавляет новые инструкции и, в конечном итоге, новую модель программирования (например, новые регистры).

Ни один из них не является устаревшим, исключение инструкций практически невозможно из соображений совместимости. Однако некоторые дополнительные расширения могут отсутствовать или быть удалены из новых моделей (например, FMA4 AMD), если они не очень широко распространены.
Некоторые из них являются рудиментарными, все, что можно сделать, например, с FPU и MMX, можно сделать более эффективно с SSE +.

Они не являются взаимоисключающими в том смысле, что вы можете использовать тот или иной, в конце концов, это инструкции, а не режимы работы (например, реальный и защищенный режимы).
Единственный возможный «конфликт» - это между MMX и FPU, поскольку они разделяют нижнюю часть одного и того же набора регистров, но имеют другую модель программирования.
Новые векторные регистры выросли со 128 бит до 256 бит и до 512 бит, каждый раз, когда предыдущие регистры становились младшей частью нового единицы.

Вы можете использовать их все вместе, они предлагают конкретную аппаратную поддержку, реализующую простые операции.

Они похожи на кубики Лего, вы ограничены только вашим воображением (или фантазией дизайнеров).


Вот простой список расширений этого набора инструкций.
Перечислены только некоторые функции, полную информацию см. На Intel Manual Vol1 из глав с 9 по 14.

См. Также https://hjlebbink.github.io/x86doc/ для оглавления тома Intel. 2 (справочник по набору инструкций) со списком расширений, добавляющих инструкции к этому ручному вводу.

  • MMX
    Представьте восемь 64-битных регистров (MM0-MM7) и инструкции для работы с восемью знаковыми / беззнаковыми байтами, четырьмя знаковыми / беззнаковыми словами, двумя знаковыми / беззнаковыми двойными словами.

  • 3DNow!
    Добавьте в MMX поддержку операндов с плавающей запятой одинарной точности. Поддерживается несколько операций, например сложение, вычитание, умножение.

  • SSE
    Представьте восемь / шестнадцать 128-битных регистров (XMM0-XMM7 / 15) и инструкции для работы с четырьмя операндами одинарной точности с плавающей запятой. Также добавьте целочисленные операции к регистрам MMX. (Целочисленная MMX-часть SSE иногда называется MMXEXT и была реализована на нескольких процессорах сторонних производителей без регистров xmm и части SSE с плавающей запятой.)

  • SSE2
    Представляет инструкцию для работы с двумя операндами с плавающей запятой двойной точности и упакованными целыми числами типа байт / слово / двойное слово / qword в 128-битных регистрах xmm.

  • SSE3
    Добавьте несколько различных инструкций (в основном с плавающей запятой), включая специальный вид невыровненной загрузки (lddqu), который был лучше на Pentium 4, инструкцию синхронизации, горизонтальное добавление / добавление.

  • SSSE3
    Снова разнообразный набор инструкций, в основном целочисленный. Первое перемешивание, которое берет свой управляющий операнд из регистра вместо жестко запрограммированного (pshufb). Больше горизонтальной обработки, перемешивания, упаковки / распаковки, сложения и добавления байтов, а также некоторых специализированных целочисленных операций добавления / распаковки.

  • SSE4 (SSE4.1, SSE4.2)
    Добавьте множество инструкций. Заполните множество пробелов, предоставив минимальные и максимальные значения, а также другие операции для всех целочисленных типов данных (особенно 32- битовое целое число отсутствовало), где ранее целое число min было доступно только для беззнаковых байтов и подписанных 16-битных. Также масштабирование, округление FP, смешивание, операции линейной алгебры, обработка текста, сравнения. Также невременная нагрузка для чтения видеопамяти или копирования ее обратно в основную память. (Ранее были доступны только магазины NT.)

  • AESNI
    Добавьте поддержку ускорения симметричного шифрования / дешифрования AES.

  • AVX Добавьте восемь / шестнадцать 256-битных регистров (YMM0-YMM7 / 15).
    Поддержка всех предыдущих типов данных с плавающей запятой. Три инструкции операнда.

  • FMA
    Добавить слитые, умножить Сложить и соотнести инструкции.

  • AVX2
    Добавьте поддержку целочисленных типов данных.

  • AVX512F
    Добавить восемь / тридцать два 512 бит регистры (ZMM0-ZMM7 / 31) и восемь 64-битных регистров маски (k0-k7). Увеличьте ширину большинства предыдущих инструкций до 512 бит. Дополнительные части AVX512 добавляют инструкции для экспонент и обратных чисел (AVX512ER), предварительной выборки разброса / сбора данных (AVX512PF), обнаружения конфликта разброса (AVX512CD), сжатия, расширения.

  • IMCI (Intel Xeon Phi)
    Ранняя разработка AVX512 для сопроцессора Intel Xeon Phi первого поколения (Knight's Corner).

person Community    schedule 18.07.2015
comment
Хорошее объяснение. Я хотел бы также упомянуть, что аналогично перекрытию MMX / FP, XMMi на самом деле является нижней частью YMMi, а это, в свою очередь, нижней частью ZMMi. - person hayesti; 18.07.2015
comment
@hayesti, ага. Обновляю ответ. - person ; 18.07.2015
comment
Не уверен, что правильно сказать, что все, что можно сделать с помощью FPU, можно сделать с помощью SSE более эффективно. Попробуйте сделать 80-битные числа с плавающей запятой с помощью SSE ... - person user541686; 18.07.2015
comment
Хм, knm241 и Питер Кордес, у вас обоих очень хорошие ответы, которые дополняют друг друга. Хотите объединить информацию? Спасибо вам обоим! - person snoukkis; 19.07.2015
comment
Вы забыли SSE4a и XOP. XOP особенно важен, потому что он добавляет, например, 64-битные инструкции сравнения, которые Intel получает только с AVX512. Он завершает целочисленный набор операций, который есть у скалярных инструкций, за исключением adc и mulx. - person Z boson; 20.07.2015