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

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

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

  • MMX
  • инструкции 3DNow!
  • SSE
  • С SSE2
  • SSE3
  • SSSE3
  • SSE4
  • AVX
  • поддержкой AVX2
  • AVX512
  • Я что-то забыла?

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

некоторые из них устарели? Какие из них все еще актуальны? Я слышал ссылки на "legacy SSE".

некоторые из них взаимоисключающие? Т. е. у них одинаковые части оборудования?

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

2 ответов


недавно я обновил тег wikis для SSE, AVX и x86С SSE2, поддержкой AVX2). Они покрывают многое из этого. TL; DR сводка: AVX свертывает все предыдущие версии SSE и предоставляет 3-операнд версии этих инструкций. Также 256b версии большинства FP (AVX) и int (AVX2) insns.

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

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

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

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


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

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

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

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

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

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


вот простой список расширений этого набора инструкций.
перечислены только некоторые функции, для полной справки см. Руководство Intel Vol1 содержит от главы 9 до 14.

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

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

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

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

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

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

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

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

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

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

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

  • поддержкой AVX2
    Добавить поддержку типов данных integer.

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

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