2015-07-18 2 views
10

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

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

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

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

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

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

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

+0

Сверху моей головы: никто не устарел; SSE - это серия, как и AVX; смешение SSE и AVX - не очень хорошая идея. Я уверен, что Wikipedia или официальные документы могут разрешить детали. – Jeff

+2

@Jeff 3DNow! устарел – harold

+0

Да, вы забыли SSE4a и XOP. –

ответ

8

Я недавно обновил теги вики для SSE, AVX и x86SSE2, avx2). Они охватывают много всего этого. tl; dr summary: AVX сворачивает все предыдущие версии SSE и предоставляет 3-операндовые версии этих инструкций. Также 256-битные версии большинства 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/целочисленные инструкции все используют одинаковые порты выполнения. Вы не можете сделать больше в параллельном порядке, смешав их. (за исключением Haswell, где один из 4 портов ALU может обрабатывать не-векторные insns, такие как GP reg ops и ветви).

+0

Хмм, knm241 и Питер Кордес, у вас обоих есть очень хорошие ответы, которые дополняют друг друга. Умеете ли вы объединить информацию? Спасибо вам обоим! – snoukkis

+0

Я буду отмечать это правильно, потому что он короче, поэтому другой ответ будет по-прежнему видимым после этого. – snoukkis

+0

Я просто буду ссылаться на ответ knm в моем втором абзаце. Я хочу, чтобы мой ответ был как можно более коротким, так что он на цель. Список того, что было в каждой версии SSE, доступен в другом месте. Возможно, это не так хорошо, как ответ knm241. Я добавил абзац о том, что, если CPU compat не является проблемой, мы действительно никогда не будем использовать кодировку векторных инструкций, отличную от VEX, в новом коде. Я думаю, что кодировка VEX иногда 1 байт дольше, но обычно нет. Единственная причина не в том, чтобы избежать «vzeroupper» при вызове кода SSE, который вы не можете перекомпилировать/собрать. –

6

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

+0

Хорошее объяснение. Я хотел бы также упомянуть, что в аналогичном ключе с перекрытием MMX/FP XMMi на самом деле является нижней частью YMMi, а это, в свою очередь, является нижней частью ZMMi. – hayesti

+0

@hayesti, да. Я обновляю ответ. –

+2

Не уверен, что правильно сказать, что все, что можно сделать с помощью FPU, можно сделать с SSE более эффективно. Попробуйте сделать 80-битные поплавки с SSE ... – Mehrdad