ARMv6 vs ARMv7

arm vs arm

V současné době jde o dvě nejrozšířenější ARMové architektury. Lze se s nimi setkat na většině současných smartphonů i jednodeskových počítačů. Z logiky věci je ARMv6 (ARM verze 6) starší architekturou a ARMv7 (ARM verze 7) architekturou novější. Díky modularitě ARMových jader není rozdíl mezi schopnostmi jednotlivých architektur zdaleka tak přehledný, jak by se mohlo zdát na první pohled. Nepřehlednost poté vede ke vzniku různých mýtů jako např. ARMv6 nemá FPU zatímco ARMv7 má nebo ARMv6 má FPU schopnou pracovat pouze se single přesností atd. Tahle tvrzení nejsou ovšem vždy pravdivá. Jaký je tedy ale mezi architekturami doopravdy rozdíl?

Především lze říci, že rozdíl v základní ARM instrukční sadě je naprosto minimální. Registry ARM jádra jsou u obou architektur identické. ARMv7 je zpětně kompatibilní s ARMv6, takže pokud je strojový kód kompilovaný pro ARMv6 bude fungovat i na ARMv7. ARM dbá na přísně RISCovou architekturu a tak základní ARM instrukční sada umí stále jen velmi jednoduché operace. Stále tu úplně chybí dělení, či jakékoliv operace s floating-point (desetinnými) hodnotami. Na složité věci má ARM koprocesory (rozšíření), které leží na stejném křemíku jako ARM jádro. Rozšíření jsou nicméně volitelná a výrobce čipu se může rozhodnout je prostě v čipu nepoužít. Hlavní rozdíl ARMv6 x ARMv7 je právě v rozšířeních procesoru.

ARMv7 se také nově rozvětvuje do 3 skupin, podle druhu použití – ARMv7-A, ARMv7-R, ARMv7-M. Skupiny se liší přístupem k paměti, latencí, řízením přerušení. M-série je nejblíže chování mikrokontroléru na němž běží kód s deterministických chováním v čase (bez OS), A-série je naopak blíže chování klasického PC na kterém běží operační systém a na něm aplikace. Článek se bude dále zabývat A-sérií, protože ta je využita ve většině jednodeskových počítačů.

ARMv7 přidává některá nová rozšíření popř. implementuje nové verze pro různá rozšíření.

Zásadní jsou:

VFP
Vector Floating Point – koprocesor pro vektorové (i skalární) zpracování operací s floating point hodnotami. Přestože je volitelný, je prakticky vždycky implementován. U ARMv6 i ARMv7 jde de facto o standardní floating point koprocesor, který čipu umožňuje hardwarově sčítat, odčítat, dělit i násobit v single i double přesnosti. VFP také umožňuje zpracovat dávku (vektor) aritmetických výpočtů (jeden typ aritmetické operace s dávkou operandů) pomocí jediné instrukce. Výpočty s vektory jsou ovšem prováděny sekvenčně, jeden výpočet po druhém. Nejde tedy o data-level paralelismus jak bývá dnes v případě SIMD instrukcí zvykem (např. MMX/SSE). Spíše než ke zrychlení samotného výpočtu tedy dochází k úspoře strojového kódu – což ovšem ve finále vede také ke zrychlení zpracování.

  • architektura ARMv6
    Zahrnuje VFPv2 volitelně (obvykle je implementováno)
  • architektura ARMv7
    Zahrnuje VFPv3 volitelně (obvykle je implementováno). VFPv3 přináší několik drobných vylepšení. Především přidává nové vlastnosti instrukcím VCVT a VMOV. Některé operace s floating point hodnotami mohou díky tomu probíhat efektivněji.

Technologie Thumb
Standardní ARM instrukční sada je tvořena pouze 32-bitovými instrukcemi. Ovšem ne každá instrukce tolik paměťového prostoru skutečně potřebuje. To může vést k neefektivitě při načítání instrukcí z paměti a samozřejmě ke zbytečně objemnému strojovému kódu. Thumb technologie má za úkol optimalizovat velikost strojového kódu tím, že nahrazuje některé nejpoužívanější 32-bit instrukce jejich 16-bitovými alternativami.

  • architektura ARMv6
    Zahrnuje první verzi technologie Thumb. Technologie Thumb v této verzi mohla být problematická, protože pro zpracování 32-bit ARM instrukcí a 16-bit Thumb instrukcí byl procesor nucen přepínat mezi Thumb režimem a ARM režimem, nebo složitější 32-bit instrukce rozdělit na víc 16-bit Thumb instrukcí. To vedlo k neefektivitě – zvlášť při užívání instrukcí pro práci s plovoucí desetinnou čárkou (které neměly Thumb alternativu). Pokud je tedy kompilována aplikace, která často pracuje s float hodnotami, cílená na ARMv6, je zvykem Thumb technologii nepoužívat.
  • architektura ARMv7
    Zahrnuje technologii Thumb-2. Ta přidává 32-bit instrukce v režimu Thumb. Je důležité poznamenat, že funkce Thumb instrukcí je identická s funkcí ARM instrukcí, pouze se mění kódování instrukce v paměti. Nyní lze tedy volně kombinovat 16-bit a 32-bit instrukce bez ztráty na výkonu. ARMv7 tedy může z Thumb technologie těžit značnou výkonností výhodu.

NEON
Rozšíření NEON představuje engine pro zpracování aritmetických operací dávkou – za pomocí SIMD instrukcí. Podobně jako při vektorovém výpočtu na VFP jsou i zde operandy zadány jako vektor v rámci jedné instrukce a dochází tak ke značné úspoře při zpracování. Na rozdíl od VFP NEON zpracovává celou dávku paralelně a nešetří tak pouze počet instrukcí ve strojovém kódu, ale také značně zrychluje samotný výpočet. NEON je velmi výhodný zvlášť při kódování/dekódování multimédií, 2D/3D grafiky apod. Lze ještě poznamenat, že NEON umí pracovat s plovoucí desetinnou čárkou pouze v single přesnosti.

  • architektura ARMv6
    Engine NEON nezahrnuje.
  • architektura ARMv7
    Zahrnuje NEON volitelně (obvykle je implementován)

Závěr
ARMv7 může být efektivnější a rychlejší platformou, ale ne bezpodmínečně. Např. rozšíření NEON (na ARMv7) umí nahradit funkci pomalejšího VFP, ale pouze pro float hodnoty se single přesností. Nepomůže tedy vždy. Některé kompilátory také umí vektorizovat některé výpočty, aby bylo možné NEON používat co nejvíce. Ne vždy to ovšem funguje ideálně. Pokud jde o hrubý výkon (počet MIPS na MHZ na jádro) jsou směrodatnější verze Cortex jádra (ARM Cortex-A5, Cortex-A7, Cortex-A9, Cortex-A15, atd.). Architektura a jednotlivá rozšíření procesoru jsou ovšem velmi významná pokud konfigurujeme kompilátor pro daný hardware nebo pokud vybírám port Linuxu pro daný hardware. Např. pokud vezmeme port Debian armhf. Port je pro platformu ARM s hardwarovou FPU (armhf znamená ARM Hard Float). Nicméně také vyžaduje Thumb-2 a VFP3D16. Tedy na ARMv6 port nespustíme, protože ARMv6 pravděpodobně bude disponovat pouze Thumb(1) a VFP2. Musíme tedy sáhnout po portu Debian armel, nebo si Debian zkompilovat pro vlastní hardwarovou konfiguraci.

Be the first to comment

Leave a Reply