Sada instrukcí pro manipulaci s bity - Bit manipulation instruction set
Sady instrukcí pro manipulaci s bity (Sady BMI) jsou rozšířeními x86 architektura sady instrukcí pro mikroprocesory z Intel a AMD. Účelem těchto instrukčních sad je zlepšit rychlost bit manipulace. Všechny pokyny v těchto sadách nejsouSIMD a fungují pouze pro všeobecné účely registry.
Intel vydává dvě sady: BMI (zde označované jako BMI1) a BMI2; oba byli představeni s Haswell mikroarchitektura. Další dvě sady byly publikovány společností AMD: ABM (Pokročilá bitová manipulace, což je také podmnožina SSE4a implementováno společností Intel jako součást SSE4.2 a BMI1) a TBM (Manipulace s koncovými bity, rozšíření zavedené s Piledriver procesory založené na rozšíření jako BMI1, ale opět klesly na Zen - založené na procesorech).[1]
ABM (Advanced Bit Manipulation)
ABM je implementován pouze jako jediná instrukční sada od AMD; všechny procesory AMD podporují oba pokyny nebo žádný. Intel zvažuje POPCNT
jako součást SSE4.2 a LZCNT
jako součást BMI1. POPCNT
má samostatný CPUID vlajka; Intel však používá AMD ABM
vlajka k označení LZCNT
podpora (od LZCNT
dokončuje ABM).[2]
Návod | Popis[3] |
---|---|
POPCNT | Počet obyvatel |
LZCNT | Počáteční nuly |
LZCNT
souvisí s obrácením bitového skenování (BSR
) instrukce, ale nastaví příznaky ZF (pokud je výsledek nula) a CF (je-li zdroj nulový) namísto nastavení ZF (pokud je zdroj nulový). Také produkuje definovaný výsledek (velikost zdrojového operandu v bitech), pokud je zdrojový operand nulový. Pro nenulový argument součet LZCNT
a BSR
result is argument bit width minus 1 (for example, if 32-bit argument is 0x000f0000
, LZCNT dává 12 a BSR dává 19).
BMI1 (sada instrukcí pro manipulaci s bitem 1)
Níže uvedené pokyny jsou povoleny BMI
bit v CPUID. Intel oficiálně zvažuje LZCNT
jako součást BMI, ale inzeruje LZCNT
podpora pomocí ABM
Příznak funkce CPUID.[2] BMI1 je k dispozici u AMD Jaguár,[4] Piledriver[5] a novější procesory a v procesorech Intel Haswell[6] a novější procesory.
Návod | Popis[2] | Ekvivalentní výraz C.[7][8] |
---|---|---|
ANDN | Logické a ne | ~ x & y |
BEXTR | Výpis bitového pole (s registrem) | (src >> start) & ((1 << len) - 1) |
BLSI | Extrahujte nejnižší sadu izolovaného bitu | x & -x |
BLSMSK | Získejte masku až po nejnižší nastavený bit | x ^ (x - 1) |
BLSR | Resetovat nejnižší nastavený bit | x & (x - 1) |
TZCNT | Spočítejte počet koncových nulových bitů | 31 + (! X) - (((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
je téměř totožný s Bit Scan Forward (BSF
) instrukce, ale nastaví příznaky ZF (pokud je výsledek nula) a CF (je-li zdroj nulový) namísto nastavení ZF (pokud je zdroj nulový). Pro nenulový argument je výsledek TZCNT
a BSF
je roven.
BMI2 (sada pokynů pro manipulaci s bitem 2)
Intel představil BMI2 společně s BMI1 ve své řadě procesorů Haswell. Pouze AMD vyrobilo procesory podporující BMI1 bez BMI2; BMI2 je podporován AMD Rypadlo architektura a novější.[9]
Návod | Popis |
---|---|
BZHI | Nulové vysoké bity začínající zadanou bitovou pozicí [src & (1 << inx) -1]; |
MULX | Nepodepsané množení bez ovlivnění příznaků a libovolných cílových registrů |
PDEP | Vložení paralelních bitů |
PEXT | Extrakt paralelních bitů |
RORX | Otočit logicky doprava bez ovlivnění příznaků |
SARX | Posuňte aritmetické právo bez ovlivnění příznaků |
SHRX | Posuňte logické doprava bez ovlivnění příznaků |
SHLX | Posuňte logickou levici bez ovlivnění příznaků |
Paralelní ukládání bitů a extrakce
The PDEP
a PEXT
instrukce jsou nové zobecněné instrukce komprimace a rozbalení na bitové úrovni. Berou dva vstupy; jeden je zdroj a druhý je selektor. Selektor je bitmapa, která vybírá bity, které mají být zabaleny nebo vybaleny. PEXT
zkopíruje vybrané bity ze zdroje do souvislých bitů cíle v nízkém pořadí; cílové bity vyššího řádu jsou vymazány. PDEP
dělá opak pro vybrané bity: souvislé bity nižšího řádu jsou zkopírovány do vybraných bitů cíle; ostatní cílové bity jsou vymazány. To lze použít k extrakci libovolného bitového pole vstupu a dokonce k hodně přeskupení na bitové úrovni, které by dříve bylo drahé. Zatímco to, co tyto pokyny dělají, je podobné bitové úrovni shromáždit-rozptýlit Pokyny SIMD, PDEP
a PEXT
instrukce (stejně jako zbytek instrukčních sad BMI) fungují na univerzálních registrech.[10]
Pokyny jsou k dispozici ve 32bitové a 64bitové verzi. Příklad použití libovolného zdroje a selektoru v 32bitovém režimu je:
Návod | Maska voliče | Zdroj | Destinace |
---|---|---|---|
PEXT | 0xff00fff0 | 0x12345678 | 0x00012567 |
PDEP | 0xff00fff0 | 0x00012567 | 0x12005670 |
Procesory AMD před Zen 3[11] které implementují PDEP a PEXT v mikrokódu s latencí 18 cyklů[12] spíše než jeden cyklus. Výsledkem je, že pokud je maska známá, je často rychlejší použít jiné pokyny na AMD.
TBM (Trailing Bit Manipulation)
TBM sestává z instrukcí doplňujících instrukční sadu spuštěnou BMI1; jejich doplňková povaha znamená, že nemusí být nutně použity přímo, ale mohou být generovány optimalizačním kompilátorem, pokud je podporován. AMD představilo TBM společně s BMI1 ve svém Piledriver[5] řada procesorů; později procesory AMD Jaguar a Zen nepodporují TBM.[4] Žádné procesory Intel (alespoň prostřednictvím Coffee Lake) nepodporují TBM.
Návod | Popis[3] | Ekvivalentní výraz C.[13] |
---|---|---|
BEXTR | Výpis bitového pole (s okamžitým) | (src >> start) & ((1 << len) - 1) |
BLCFILL | Vyplňte od nejnižšího čistého bitu | x & (x + 1) |
BLCI | Izolujte nejnižší čistý bit | x | ~ (x + 1) |
BLCIC | Izolujte nejnižší jasný bit a doplňte se | ~ x & (x + 1) |
BLCMSK | Maska od nejnižšího čistého bitu | x ^ (x + 1) |
BLCS | Nastavit nejnižší jasný bit | x | (x + 1) |
BLSFILL | Naplňte od nejnižšího nastaveného bitu | x | (x - 1) |
BLSIC | Izolujte nejnižší nastavený bit a doplňte se | ~ x | (x - 1) |
T1MSKC | Inverzní maska od koncových | ~ x | (x + 1) |
TZMSK | Maska z koncových nul | ~ x & (x - 1) |
Podpora CPU
- Intel
- Intel Nehalem procesory a novější (jako Sandy Bridge, most z břečťanu ) (POPCNT podporováno)
- Intel Silvermont procesory (podporováno POPCNT)
- Intel Haswell procesory a novější (jako Skylake, Broadwell ) (ABM, BMI1 a BMI2 podporovány)[6]
- AMD
- Na bázi K10 procesory (podporováno ABM)
- „Cat“ procesory s nízkou spotřebou
- Procesory „Heavy Equipment“
- Buldozer procesory (podporováno ABM)
- Na základě pilota procesory (podporovány ABM, BMI1 a TBM)[1]
- Na bázi parního válce procesory (podporovány ABM, BMI1 a TBM)
- Na základě rypadla procesory a novější (ABM, BMI1, BMI2 a TBM podporovány; mikrokódované PEXT a PDEP)[9]
- Zenový, Na základě Zen + a procesory (podporovány ABM, BMI1 a BMI2; mikrokódované PEXT a PDEP)
- Zen 3 procesory a novější (ABM, BMI1 a BMI2 podporovány; plná implementace hardwaru)
Upozorňujeme, že podpora rozšíření instrukcí znamená, že procesor je schopen provádět podporované pokyny pro účely kompatibility softwaru. Procesor nemusí při tom fungovat dobře. Například Excavator prostřednictvím procesorů Zen 2 implementuje instrukce PEXT a PDEP pomocí mikrokódu, což vede k tomu, že se instrukce provádějí výrazně pomaleji než stejné chování vytvořené pomocí jiných instrukcí.[15] (Softwarová metoda zvaná „zp7“ je na těchto počítačích ve skutečnosti rychlejší.)[16] Pro optimální výkon se doporučuje, aby se vývojáři kompilátorů rozhodli použít jednotlivé pokyny v rozšířeních na základě výkonnostních profilů specifických pro architekturu, nikoli na dostupnosti rozšíření.
Viz také
- Pokročilá vektorová rozšíření (AVX)
- Sada instrukcí AES
- Sada instrukcí CLMUL
- F16C
- Sada instrukcí FMA
- Intel ADX
- Sada instrukcí XOP
- Intel BCD opcodes (také se používá pro pokročilé techniky manipulace s bitem)
Reference
- ^ A b "Nové" pokyny "Buldozer" a "Piledriver" (PDF). Citováno 2014-01-03.
- ^ A b C „Intel Advanced Vector Extensions Programming Reference“ (PDF). intel.com. Intel. Červen 2011. Citováno 2014-01-03.
- ^ A b „Příručka programátora architektury AMD64, svazek 3: Obecné pokyny a systémové pokyny“ (PDF). amd.com. AMD. Říjen 2013. Citováno 2014-01-02.
- ^ A b C d „Datový list rodiny 16h AMD řady A“ (PDF). amd.com. AMD. Říjen 2013. Citováno 2014-01-02.
- ^ A b Hollingsworth, Brent. „Nové pokyny„ Buldozer “a„ Piledriver ““ (pdf). Advanced Micro Devices, Inc.. Citováno 11. prosince 2014.
- ^ A b Locktyukhin, Max. „Jak detekovat podporu nových instrukcí u 4. generace procesorů Intel® Core ™“. www.intel.com. Intel. Citováno 11. prosince 2014.
- ^ „bmiintrin.h z GCC 4.8“. Citováno 2014-03-17.
- ^ https://github.com/abseil/abseil-cpp/blob/ce4bc927755fdf0ed03d679d9c7fa041175bb3cb/absl/base/internal/bits.h#L188
- ^ A b „Jádro rypadla AMD může zvýšit dramatický výkon“. X-bitové laboratoře. 18. října 2013. Archivovány od originál 23. října 2013. Citováno 24. listopadu 2013.
- ^ Yedidya Hilewitz; Ruby B. Lee (srpen 2009). „Nový základ pro řadiče v univerzálních procesorech pro stávající a pokročilou manipulaci s bity“ (PDF). dlaně.princeton.edu. Transakce IEEE na počítačích. str. 1035–1048. Citováno 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 z GCC 4.8“. Citováno 2014-03-17.
- ^ „BIOS and Kernel Developer's Guide for AMD Family 14h“ (PDF). Citováno 2014-01-03.
- ^ „Emulátor delfínů“. Emulátor delfínů. Citováno 2020-02-07.
- ^ Wegner, Zach (4. listopadu 2020). „zwegner / zp7“.
Další čtení
- Warren Jr., Henry S. (2013). Hacker's Delight (2. vyd.). Addison Wesley - Pearson Education, Inc. ISBN 978-0-321-84268-8.