stringtranslate.com

Набор инструкций по битовой манипуляции x86

Наборы инструкций по битовой манипуляции ( наборы BMI ) являются расширениями архитектуры набора инструкций x86 для микропроцессоров Intel и AMD . Целью этих наборов инструкций является повышение скорости битовой манипуляции . Все инструкции в этих наборах не являются SIMD и работают только с регистрами общего назначения .

Intel опубликовала два набора: BMI (теперь называемый BMI1) и BMI2; они оба были введены с микроархитектурой Haswell с BMI1, соответствующими функциями, предлагаемыми набором инструкций AMD ABM, и BMI2, расширяющим их. AMD опубликовала еще два набора: ABM ( Advanced Bit Manipulation , который также является подмножеством SSE4a , реализованным Intel как часть SSE4.2 и BMI1), и TBM ( Trailing Bit Manipulation , расширение, представленное с процессорами на базе Piledriver в качестве расширения BMI1, но снова исключенное в процессорах на базе Zen ). [1]

ABM (Расширенная обработка битов)

AMD была первой, кто представил инструкции, которые теперь формируют BMI1 от Intel как часть своего набора инструкций ABM ( Advanced Bit Manipulation ), а затем добавила поддержку новых инструкций BMI2 от Intel. Сегодня AMD объявляет о доступности этих функций через BMI1 и BMI2 cpuflags от Intel и инструктирует программистов нацеливаться на них соответствующим образом. [2]

В то время как Intel рассматривает POPCNTкак часть SSE4.2 и LZCNTкак часть BMI1, и Intel, и AMD объявляют о наличии этих двух инструкций по отдельности. POPCNTимеет отдельный флаг CPUID с тем же именем, а Intel и AMD используют флаг AMD ABMдля указания LZCNTподдержки (поскольку LZCNTв сочетании с BMI1 и BMI2 завершает расширенный набор инструкций ABM). [2] [3]

LZCNTсвязана с BSRинструкцией Bit Scan Reverse ( ), но устанавливает флаги ZF (если результат равен нулю) и CF (если источник равен нулю), а не устанавливает флаг ZF (если источник равен нулю). Кроме того, она выдает определенный результат (размер исходного операнда в битах), если исходный операнд равен нулю. Для ненулевого аргумента сумма LZCNTи BSRрезультатов равна битовой ширине аргумента минус 1 (например, если 32-битный аргумент равен 0x000f0000, LZCNT дает 12, а BSR дает 19).

Кодировка LZCNTтакова, что если ABM не поддерживается, то BSRвместо этого выполняется инструкция. [4] : 227 

BMI1 (Набор инструкций по битовой манипуляции 1)

Приведенные ниже инструкции включаются битом BMIв CPUID. Intel официально рассматривает LZCNTкак часть BMI, но объявляет LZCNTо поддержке с помощью ABMфлага функции CPUID. [3] BMI1 доступен в процессорах AMD Jaguar , [5] Piledriver [6] и более новых процессорах, а также в процессорах Intel Haswell [7] и более новых процессорах.

TZCNTпочти идентична BSFинструкции Bit Scan Forward ( ), но устанавливает флаги ZF (если результат равен нулю) и CF (если источник равен нулю) вместо установки ZF (если источник равен нулю). Для ненулевого аргумента результат TZCNTи BSFравен.

Как и в случае с LZCNT, кодировка TZCNTтакова, что если BMI1 не поддерживается, то BSFвместо этого выполняется инструкция. [4] : 352 

BMI2 (Набор инструкций по битовой манипуляции 2)

Intel представила BMI2 вместе с BMI1 в своей линейке процессоров Haswell. Только AMD выпустила процессоры с поддержкой BMI1 без BMI2; BMI2 поддерживается архитектурой AMD Excavator и более новыми. [11]

Параллельный ввод и извлечение бита

Инструкции PDEPи PEXTявляются новыми обобщенными инструкциями сжатия и расширения на уровне битов. Они принимают два входа: один является источником, а другой — селектором. Селектор — это битовая карта, выбирающая биты, которые должны быть упакованы или распакованы. PEXTкопирует выбранные биты из источника в смежные младшие биты назначения; старшие биты назначения очищаются. PDEPделает противоположное для выбранных битов: смежные младшие биты копируются в выбранные биты назначения; другие биты назначения очищаются. Это можно использовать для извлечения любого битового поля ввода и даже для выполнения большого количества перетасовок на уровне битов, которые ранее были бы дорогими. Хотя то, что делают эти инструкции, похоже на инструкции SIMD для сбора-рассеиванияPDEP на уровне битов, и PEXTинструкции (как и остальные наборы инструкций BMI) работают с регистрами общего назначения. [12]

Инструкции доступны в 32- и 64-битной версиях. Пример использования произвольного источника и селектора в 32-битном режиме:

Процессоры AMD до Zen 3 [13] , реализующие PDEP и PEXT, делают это в микрокоде с задержкой 18 циклов [14] вместо 3 циклов (Zen 3). [15] В результате на этих процессорах часто быстрее использовать другие инструкции. [16]

TBM (манипуляция хвостовой частью)

TBM состоит из инструкций, дополнительных к набору инструкций, начатому BMI1; их дополнительная природа означает, что они не обязательно должны использоваться напрямую, но могут быть сгенерированы оптимизирующим компилятором, если поддерживаются. AMD представила TBM вместе с BMI1 в своей линейке процессоров Piledriver [6] ; более поздние процессоры AMD Jaguar и Zen не поддерживают TBM. [5] Ни один процессор Intel (по крайней мере, вплоть до Alder Lake ) не поддерживает TBM.

Поддерживаемые процессоры

Обратите внимание, что поддержка расширения инструкций означает, что процессор способен выполнять поддерживаемые инструкции для целей совместимости программного обеспечения. При этом процессор может работать не очень хорошо. Например, процессоры Excavator — Zen 2 реализуют инструкции PEXT и PDEP с помощью микрокода, что приводит к тому, что инструкции выполняются значительно медленнее, чем то же самое поведение, воссозданное с использованием других инструкций. [20] (Программный метод под названием «zp7» на самом деле быстрее на этих машинах.) [21] Для оптимальной производительности разработчикам компиляторов рекомендуется использовать отдельные инструкции в расширениях на основе профилей производительности, специфичных для архитектуры, а не на доступности расширений.

Смотрите также

Ссылки

  1. ^ ab "Новые инструкции для "Бульдозера" и "Сваебойщика"" (PDF) . Получено 2014-01-03 .
  2. ^ ab "Руководство программиста по архитектуре AMD64, том 3: общие и системные инструкции" (PDF) . Получено 20 июля 2022 г.
  3. ^ abc "Intel Advanced Vector Extensions Programming Reference" (PDF) . intel.com . Intel . Июнь 2011 . Получено 2014-01-03 .
  4. ^ abcd "Руководство программиста по архитектуре AMD64, том 3: общие и системные инструкции" (PDF) . Редакция 3.32. AMD . Март 2021 г. Архивировано (PDF) из оригинала 2021-04-08 . Получено 2021-04-08 .
  5. ^ abcd "Семейство 16h AMD A-Series Data Sheet" (PDF) . amd.com . AMD . Октябрь 2013 . Получено 2014-01-02 .
  6. ^ ab Hollingsworth, Brent. "Новые инструкции "Bulldozer" и "Piledriver"" (PDF) . Advanced Micro Devices, Inc . Получено 11 декабря 2014 г. .
  7. ^ ab Локтюхин, Макс. «Как обнаружить поддержку новых инструкций в семействе процессоров Intel® Core™ 4-го поколения». www.intel.com . Intel . Получено 11 декабря 2014 г. .
  8. ^ "bmiintrin.h из GCC 4.8" . Получено 2014-03-17 .
  9. ^ ab "sandpile.org -- архитектура x86 -- биты" . Получено 2014-03-17 .
  10. ^ "Abseil - C++ Common Libraries". GitHub . 4 ноября 2021 г.
  11. ^ ab "AMD Excavator Core May Bring Dramatic Performance Increases". X-bit labs. 18 октября 2013 г. Архивировано из оригинала 23 октября 2013 г. Получено 24 ноября 2013 г.
  12. ^ Yedidya Hilewitz; Ruby B. Lee (август 2009 г.). «Новая основа для сдвиговых устройств в универсальных процессорах для существующих и расширенных битовых манипуляций» (PDF) . palms.princeton.edu . IEEE Transactions on Computers. стр. 1035–1048 . Получено 10 февраля 2014 г. .
  13. ^ «Zen 3 — Микроархитектуры — AMD — WikiChip».
  14. ^ "Инструкционные таблицы" (PDF) . Получено 2023-09-09 .
  15. ^ "Руководство по оптимизации программного обеспечения для процессоров AMD семейства 19h". AMD Developer Central . Получено 2022-07-22 .
  16. ^ "Спасение частного Ryzen: функции замены PEXT/PDEP 32/64b для процессоров #AMD (BR/#Zen/Zen+/#Zen2) на основе zp7 @zwegner". Twitter . Получено 21.02.2022 .
  17. ^ "tbmintrin.h из GCC 4.8" . Получено 2014-03-17 .
  18. ^ "Руководство разработчика BIOS и ядра для семейства AMD 14h" (PDF) . Получено 2014-01-03 .
  19. ^ "AMD Zen 3 Ryzen Deep Dive Review: протестированы 5950X, 5900X, 5800X и 5600X" . Получено 26.12.2021 .
  20. ^ "Отчет о ходе разработки Dolphin: декабрь 2019 г. и январь 2020 г.". Dolphin Emulator . 7 февраля 2020 г. Получено 07.02.2020 .
  21. Вегнер, Зак (4 ноября 2020 г.). "цвегнер/zp7". Гитхаб .

Дальнейшее чтение

Внешние ссылки