Набор команд битовой манипуляции - Bit manipulation instruction set
Наборы инструкций битовой манипуляции (Наборы ИМТ) являются расширениями x86 архитектура набора команд за микропроцессоры из Intel и AMD. Целью этих наборов инструкций является повышение скорости битовая манипуляция. Все инструкции в этих наборах не являютсяSIMD и работать только на универсальных регистры.
Intel опубликовала два набора: BMI (здесь обозначается как BMI1) и BMI2; они оба были представлены Haswell микроархитектура. Еще два набора выпустила AMD: ABM (Расширенное управление битами, который также является подмножеством SSE4a реализовано Intel в рамках SSE4.2 и BMI1) и TBM (Манипуляция конечным битом, расширение, представленное с Копер -процессоры как расширение BMI1, но снова упали Дзен на базе процессоров).[1]
ABM (расширенное управление битами)
ABM реализована AMD только как единый набор инструкций; все процессоры AMD поддерживают обе инструкции или ни одну из них. Intel считает POPCNT
как часть SSE4.2, и LZCNT
как часть ИМТ1. POPCNT
имеет отдельный CPUID флаг; однако Intel использует AMD ПРО
флаг для обозначения LZCNT
поддержка (поскольку LZCNT
завершает ПРО).[2]
Инструкция | Описание[3] |
---|---|
POPCNT | Количество населения |
LZCNT | Количество ведущих нулей |
LZCNT
относится к обратному сканированию битов (BSR
), но устанавливает флаги ZF (если результат равен нулю) и CF (если источник равен нулю), а не устанавливает ZF (если источник равен нулю). Кроме того, он дает определенный результат (размер исходного операнда в битах), если исходный операнд равен нулю. Для ненулевого аргумента сумма LZCNT
и BSR
результаты - разрядность аргумента минус 1 (например, если 32-разрядный аргумент равен 0x000f0000
, LZCNT дает 12, а BSR дает 19).
BMI1 (набор инструкций для обработки битов 1)
Приведенные ниже инструкции предназначены для ИМТ
бит в CPUID. Intel официально считает LZCNT
как часть BMI, но рекламирует LZCNT
поддержка с помощью ПРО
Флаг функции CPUID.[2] BMI1 доступен в AMD Ягуар,[4] Копер[5] и более новые процессоры, а в Intel Haswell[6] и более новые процессоры.
Инструкция | Описание[2] | Эквивалентное выражение C[7][8] |
---|---|---|
И Н | Логично, а не | ~ x & y |
BEXTR | Извлечение битового поля (с регистром) | (src >> начало) & ((1 << len) - 1) |
BLSI | Извлечь наименьший установленный изолированный бит | х & -x |
BLSMSK | Поднимите маску до самого низкого установленного бита | х ^ (х - 1) |
BLSR | Сбросить самый низкий установленный бит | х & (х - 1) |
TZCNT | Подсчитайте количество завершающих нулевых битов | 31 + (! Х) - (((x & -x) & 0x0000FFFF)? 16: 0) - (((x & -x) & 0x00FF00FF)? 8: 0) - (((x & -x) & 0x0F0F0F0F)? 4: 0) - (((x & -x) & 0x33333333)? 2: 0) - (((x & -x) & 0x55555555)? 1: 0) |
TZCNT
практически идентичен Bit Scan Forward (BSF
), но устанавливает флаги ZF (если результат равен нулю) и CF (если источник равен нулю), а не устанавливает ZF (если источник равен нулю). Для ненулевого аргумента результат TZCNT
и BSF
равно.
BMI2 (набор инструкций по манипулированию битами 2)
Intel представила BMI2 вместе с BMI1 в своей линейке процессоров Haswell. Только AMD произвела процессоры, поддерживающие BMI1 без BMI2; BMI2 поддерживается AMD Экскаватор архитектура и новее.[9]
Инструкция | Описание |
---|---|
БЖИ | Нулевые старшие биты, начинающиеся с указанной битовой позиции [src & (1 << inx) -1]; |
MULX | Беззнаковое умножение без влияния на флаги и произвольные регистры назначения |
PDEP | Депозит параллельных битов |
PEXT | Извлечение параллельных битов |
RORX | Логический поворот вправо, не затрагивая флаги |
SARX | Сдвиг арифметики вправо, не затрагивая флаги |
SHRX | Логический сдвиг вправо, не затрагивая флаги |
SHLX | Логический сдвиг влево, не затрагивая флаги |
Параллельное депонирование и извлечение бит
В PDEP
и PEXT
инструкции - это новые обобщенные инструкции сжатия и расширения на битовом уровне. Они принимают два входа; один - источник, а другой - селектор. Селектор - это битовая карта, выбирающая биты, которые должны быть упакованы или распакованы. PEXT
копирует выбранные биты из источника в смежные младшие биты места назначения; биты назначения более высокого порядка очищаются. PDEP
делает противоположное для выбранных бит: смежные младшие биты копируются в выбранные биты места назначения; другие биты назначения очищаются. Это можно использовать для извлечения любого битового поля ввода и даже выполнения большого количества перетасовки битового уровня, что раньше было бы дорогостоящим. Хотя то, что делают эти инструкции, похоже на битовый уровень сбор-разброс Инструкции SIMD, PDEP
и PEXT
инструкции (как и остальные наборы инструкций BMI) работают с регистрами общего назначения.[10]
Инструкции доступны в 32-битной и 64-битной версиях. Пример использования произвольного источника и селектора в 32-битном режиме:
Инструкция | Селекторная маска | Источник | Пункт назначения |
---|---|---|---|
PEXT | 0xff00fff0 | 0x12345678 | 0x00012567 |
PDEP | 0xff00fff0 | 0x00012567 | 0x12005670 |
Процессоры AMD до Zen 3[11] реализующие PDEP и PEXT делают это в микрокоде с задержкой 18 циклов[12] а не один цикл. В результате, если маска известна, часто бывает быстрее использовать другие инструкции AMD.
TBM (манипуляция конечными битами)
TBM состоит из инструкций, дополнительных к набору инструкций, запущенному BMI1; их взаимодополняющий характер означает, что они не обязательно должны использоваться напрямую, но могут быть сгенерированы оптимизирующим компилятором, если поддерживается. AMD представила TBM вместе с BMI1 в своем Копер[5] линейка процессоров; более поздние процессоры AMD Jaguar и Zen не поддерживают TBM.[4] Никакие процессоры Intel (по крайней мере, через Coffee Lake) не поддерживают TBM.
Инструкция | Описание[3] | Эквивалентное выражение C[13] |
---|---|---|
BEXTR | Извлечение битового поля (с немедленным) | (src >> начало) & ((1 << len) - 1) |
BLCFILL | Заполните с самого нижнего бита | х & (х + 1) |
BLCI | Изолировать самый низкий бит | х | ~ (х + 1) |
BLCIC | Изолировать самый низкий бит и дополнить | ~ х & (х + 1) |
BLCMSK | Маска от самого низкого бита | х ^ (х + 1) |
BLCS | Установить самый низкий бит очистки | х | (х + 1) |
BLSFILL | Заполните с самого низкого установленного бита | х | (х - 1) |
BLSIC | Изолировать младший установленный бит и дополнить | ~ x | (х - 1) |
T1MSKC | Обратная маска от замыкающих | ~ x | (х + 1) |
ТЗМСК | Маска из конечных нулей | ~ х & (х - 1) |
Поддерживающие процессоры
- Intel
- Intel Nehalem процессоры и новее (например, Песчаный Мост, Ivy Bridge ) (Поддерживается POPCNT)
- Intel Silvermont процессоры (поддерживается POPCNT)
- Intel Haswell процессоры и новее (например, Skylake, Broadwell ) (Поддерживаются ABM, BMI1 и BMI2)[6]
- AMD
- К10 на базе процессоры (поддерживается ABM)
- "Cat" маломощные процессоры
- Bobcat на основе процессоры (поддерживается ABM)[14]
- На базе Ягуара процессоры и новее (поддерживаются ABM и BMI1)[4]
- На основе пума процессоры и новее (поддерживаются ABM и BMI1)[4]
- Переработчики "тяжелого оборудования"
- Бульдозерный процессоры (поддерживается ABM)
- Пиледривер на базе процессоры (поддерживаются ABM, BMI1 и TBM)[1]
- На базе парового катка процессоры (поддерживаются ABM, BMI1 и TBM)
- Экскаватор на базе процессоры и новее (поддерживаются ABM, BMI1, BMI2 и TBM; микрокодированные PEXT и PDEP)[9]
- На основе дзен, Zen + на основе и процессоры (поддерживаются ABM, BMI1 и BMI2; микрокодированные PEXT и PDEP)
- Дзен 3 процессоры и новее (поддерживаются ABM, BMI1 и BMI2; полная аппаратная реализация)
Обратите внимание, что поддержка расширения инструкций означает, что процессор способен выполнять поддерживаемые инструкции в целях совместимости программного обеспечения. При этом процессор может работать некорректно. Например, процессоры Excavator и Zen 2 реализуют инструкции PEXT и PDEP с использованием микрокода, в результате чего инструкции выполняются значительно медленнее, чем такое же поведение, воссозданное с использованием других инструкций.[15] (Программный метод под названием "zp7" на самом деле быстрее на этих машинах.)[16] Для достижения оптимальной производительности рекомендуется, чтобы разработчики компилятора использовали отдельные инструкции в расширениях на основе профилей производительности для конкретной архитектуры, а не от доступности расширений.
Смотрите также
- Расширенные векторные расширения (AVX)
- Набор инструкций AES
- Набор инструкций CLMUL
- F16C
- Набор инструкций FMA
- Intel ADX
- Набор инструкций XOP
- Коды операций Intel BCD (также используется для продвинутых методов обработки битов)
Рекомендации
- ^ а б "Новые" Бульдозер "и" Пиледривер "Инструкции" (PDF). Получено 2014-01-03.
- ^ а б c «Справочник по программированию расширенных векторных расширений Intel» (PDF). intel.com. Intel. Июнь 2011 г.. Получено 2014-01-03.
- ^ а б "Руководство программиста по архитектуре AMD64, том 3: Общие и системные инструкции" (PDF). amd.com. AMD. Октябрь 2013. Получено 2014-01-02.
- ^ а б c d «Спецификация семейства 16h AMD A-Series» (PDF). amd.com. AMD. Октябрь 2013. Получено 2014-01-02.
- ^ а б Холлингсворт, Брент. "Новые" Бульдозер "и" Пиледривер "инструкция" (pdf). Advanced Micro Devices, Inc. Получено 11 декабря 2014.
- ^ а б Локтюхин, Макс. «Как обнаружить поддержку новых инструкций в семействе процессоров Intel® Core ™ 4-го поколения». www.intel.com. Intel. Получено 11 декабря 2014.
- ^ "bmiintrin.h из GCC 4.8". Получено 2014-03-17.
- ^ https://github.com/abseil/abseil-cpp/blob/ce4bc927755fdf0ed03d679d9c7fa041175bb3cb/absl/base/internal/bits.h#L188
- ^ а б «Ядро экскаватора AMD может существенно повысить производительность». X-bit labs. 18 октября 2013 г. Архивировано с оригинал 23 октября 2013 г.. Получено 24 ноября, 2013.
- ^ Едидья Хилевиц; Руби Б. Ли (август 2009 г.). «Новая основа для переключателей в процессорах общего назначения для существующих и расширенных операций с битами» (PDF). palms.princeton.edu. Транзакции IEEE на компьютерах. стр. 1035–1048. Получено 2014-02-10.
- ^ https://en.wikichip.org/wiki/amd/microarchitectures/zen_3#Key_changes_from_Zen_2
- ^ https://www.agner.org/optimize/instruction_tables.pdf
- ^ "tbmintrin.h из GCC 4.8". Получено 2014-03-17.
- ^ "Руководство разработчика BIOS и ядра для семейства AMD 14h" (PDF). Получено 2014-01-03.
- ^ «Эмулятор дельфина». Эмулятор дельфинов. Получено 2020-02-07.
- ^ Вегнер, Зак (4 ноября 2020 г.). "zwegner / zp7".
дальнейшее чтение
- Уоррен-младший, Генри С. (2013). Хакерское наслаждение (2-е изд.). Эддисон Уэсли - Pearson Education, Inc. ISBN 978-0-321-84268-8.