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

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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


Вот простой список этих расширений набора инструкций.
Только некоторые функции перечислены, для полной справки см. Intel Manual Vol1 из раздела 9-14.

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

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

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

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

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

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

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

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

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

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

  • FMA
    Добавить Fused Multiply Добавить и скоррелированные инструкции.

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

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

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