Hlavní navigace

RISCová architektura PowerPC: AltiVec a operace s vektory

6. 9. 2016
Doba čtení: 20 minut

Sdílet

Prakticky u všech RISCových architektur nalezneme rozšíření instrukční sady určená pro operace s vektory dat. Podobná rozšíření najdeme i u PowerPC: AltiVec, Velocity Engine či Vector Multimedia Extension.

Obsah

1. RISCová architektura PowerPC: operace s vektory

2. Rozšíření instrukčních sad RISCových procesorů umožňující práci s vektory

3. Sada registrů určená pro vektorové operace na procesorech PowerPC

4. Vektorové pracovní registry VR0 až VR31

5. VSCR – Vector Status and Control Register

6. Vyřešení problému s přepínáním kontextu: registr VRSAVE

7. Podporované formáty vektorů

8. Blok Vector Permute Unit (VPU)

9. Blok Vector Arithmetic Logic Unit (VALU)

10. Instrukce pro načtení či uložení vektorů

11. Celočíselné vektorové operace

12. Saturace v celočíselných operacích

13. Jména instrukcí

14. Obsah druhého pokračování článku

15. Odkazy na Internetu

1. RISCová architektura PowerPC: operace s vektory

Klasické RISCové architektury, s nimiž jsme se až doposud setkali, byly většinou již v devadesátých letech minulého století rozšířeny o nové sady instrukcí určených pro provádění operací nad vektory. Pod pojmem „vektor“ se v této oblasti skrývá datová struktura o šířce typicky 64 či 128 bitů, která je rozdělena do prvků, z nichž každý mívá šířku 8, 16, 32 či 64 bitů a je do něj uložena celočíselná hodnota (se znaménkem či bez znaménka) popř. hodnota reprezentovaná ve formátu plovoucí řádové čárky. Nad takto reprezentovanými datovými strukturami je vystavěna sada specializovaných instrukcí, které například dokážou sečíst dva vektory s formátem 4 prvky po 16bitech, provést permutaci prvků v jednom vektoru, výběr prvků na základě bitového pole atd. Důležité je, že zvolená operace se vždy provádí paralelně nad všemi prvky vektoru (vektorů), což je odlišné chování od prapůvodních vektorových procesorů, které byly založeny na sekvenčním provádění operací a velmi hluboké pipeline (příkladem původního konceptu mohou být první modely superpočítačů Cray).

V dnešním článku se budeme zabývat popisem technologie nazývané AltiVec, kterou mohou (ale nutně nemusí) být vybaveny mikroprocesory s architekturou PowerPC. Ve skutečnosti není AltiVec jediným názvem této technologie, protože se můžeme setkat taktéž s označením Velocity Engine či Vector Multimedia Extension. Důvodem, proč se tato technologie může jmenovat různě, spočívá v tom, že AltiVec je ochrannou známkou společnosti FreeScale, takže například firma Apple, která čipy PowerPC používala ve svých počítačích, začala namísto AltiVec prosazovat jméno Velocity Engine a IBM pak VMX neboli Vector Multimedia Extension. Pojmenování IBM je sice příliš dlouhé a není příliš „cool“, ale zato poměrně přesně vystihuje určení této technologie – 3D grafika (dnes již pravděpodobně bezpředmětné), kodeky, obecné zpracování signálů atd.

2. Rozšíření instrukčních sad RISCových procesorů umožňující práci s vektory

S rozšířením instrukčních sad mikroprocesorů s původně čistě RISCovou instrukční sadou o vektorové operace (přesněji řečeno i SIMD operace) jsme se již v tomto seriálu setkali, a to dokonce hned několikrát. Jen pro krátké připomenutí:

  1. Typickým příkladem čistého RISCového mikroprocesoru byla původní architektura MIPS představovaná mikroprocesory R2000 (rok vzniku 1985) a R3000 (rok vzniku 1988). Aby bylo možné každý krok instrukce provést v pětiřezové instrukční pipeline za jediný takt, neobsahovaly tyto mikroprocesory ani instrukce se složitými adresovacími režimy, ani instrukce pro celočíselné násobení a dělení. V dalších revizích architektury MIPS však docházelo k postupnému rozšiřování instrukční sady a tím pádem i k přidávání dalších funkčních jednotek buď přímo na čip s mikroprocesorem, nebo na další pomocné čipy (koprocesory). V roce 1996 byly představeny první čipy implementující rozšiřující instrukční sadu MDMX neboli MIPS Digital Media eXtension. Tato instrukční sada byla o tři roky později následována další rozšiřující instrukční sadou s všeříkajícím názvem MIPS-3D.
  2. Rozšíření označované MDMX neboli MadMax je orientováno na celočíselné operace, včetně sčítání a odčítání se saturací. Vektory mají v tomto případě šířku 64bitů a mohou být rozděleny na prvky o menší bitové šířce (bajt atd.).
  3. Naproti tomu MIPS-3D obsahuje 13 nových instrukcí orientovaných na 3D grafiku: transformace vertexů, normalizaci vektorů, aplikaci perspektivní projekce atd. V současnosti je sice možné provádění těchto operací přenechat grafickému akcelerátoru, ale v době vzniku technologie MIPS-3D byly grafické akcelerátory určeny především pro rasterizaci trojúhelníků a řešení viditelnosti pomocí paměti hloubky (Z-bufferu), zatímco základní zpracování trojrozměrné scény bylo ponecháno na mikroprocesoru.
  4. Podobný „osud“ čekal i RISCové mikroprocesory PA-RISC. Prvním rozšířením instrukční sady o SIMD operace je technologie nazvaná Multimedia Acceleration eXtensions 1 (MAX-1), která z pohledu programátora instrukční sadu rozšířila o pouhých devět pečlivě vybraných instrukcí. Nové instrukce byly určeny pro zpracování šestnáctibitových slov nazývaných „subword data“, popř. „halfword data“ (označením „word“ jsou v případě 32bitových mikroprocesorů PA-RISC samozřejmě myšlena 32bitová slova, menší informační jednotky se původně neadresovaly). Vždy dvojice šestnáctibitových slov mohla být uložena do libovolného pracovního registru GR1GR31, protože registr GR0 obsahoval konstantu 0, jak je tomu ostatně u RISCových procesorů zvykem. Vzhledem k tomu, že každý pracovní registr mohl v případě nových instrukcí MAX-1 obsahovat dva prvky, znamenalo to dvojnásobné urychlení některých základních aritmetických operací. Ve skutečnosti však bylo možné díky párování ALU instrukcí pro dvě paralelně pracující aritmeticko-logické jednotky dosáhnout až čtyřnásobného urychlení. Jinými slovy: pokud nenastaly kolize při přístupu k pracovním registrům, bylo možné v každém taktu dokončit čtyři ALU operace prováděné nad šestnáctibitovými půlslovy (halfword). V době vzniku technologie MAX-1, kdy se výpočetní výkon mikroprocesorů pohyboval na hraně použitelnosti pro multimediální aplikace (například pro přehrávání videa ve formátu MPEG-1) se tedy jednalo o dosti výraznou pomoc.
  5. Další řadou RISCových mikroprocesorů je po MIPS a PA-RISC architektura SPARC, resp. přesněji UltraSPARC. Tyto mikroprocesory začaly být doplňovány technologií nazvanou VIS, což je zkratka plného názvu „Visual Instruction Set“. Instrukční sada VIS se v mnoha ohledech odlišuje od výše popsané sady MIPS-3D, což však není překvapivé, protože se jedná o instrukční sadu určenou pro jiné účely. V rámci VIS byly mikroprocesory UltraSPARC obohaceny o přibližně padesát nových instrukcí, které implementovaly aritmetické operace, logické operace, rozbalení a zabalení dat ve vektorech, změnu zarovnání dat ve vektorech, datové konverze a na závěr i operace zjednodušující adresování jednorozměrných, dvourozměrných a trojrozměrných polí. Nesmíme zapomenout ani na blokové operace, které v době vzniku této technologie umožňovaly blokový přenos dat rychlostí až 300 MB/sekundu, a to při libovolném zarovnání.
  6. Dostáváme se k asi nejznámějším RISCovým procesorům současnosti – k čipům ARM. Pro tyto čipy bylo navrženo rozšíření instrukční sady známé pod jménem Vector Floating Point. Technologie VFP byla navržena takovým způsobem, aby ji bylo možné použít v mnoha aplikačních oblastech, například v řídicích jednotkách automobilů, pro zpracování obrazu (konvoluční filtry, rychlá Fourierova transformace, rasterizace a další operace prováděné v tiskových procesorech), při zpracování řeči (kodeky) a taktéž pro provádění různých 3D operací (transformace) – právě v těchto oblastech lze totiž využít práci nikoli pouze se skalárními hodnotami, ale taktéž s vektory o dvou až osmi prvcích. Zajímavé je, že později došlo ke sloučení VFP s architekturou NEON.
  7. Původní architektura VFPv1 je již dnes považována za překonanou a v žádných současných čipech se s níž již nesetkáme. Druhá verze této architektury VFPv2 začala být používána na některých čipech ARMv5E, ARMv5TEJ a taktéž na ARMv6 – instrukce VFP v tomto případě rozšiřovaly původní instrukční sady ARM. Zajímavější je dnes třetí verze architektury VFP značená VFPv3 používaná od ARMv7 (samozřejmě jen u vybraných čipů – zdaleka ne všechny aplikační oblasti totiž nutně vyžadují matematický koprocesor). V tomto případě lze nové „vektorové“ instrukce používat v instrukční sadě ARM, Thumb i ThumbEE (pozn. původně se prvky vektorů zpracovávaly sekvenčně kvůli internímu omezení na jedinou FPU jednotku).
  8. V některých čipech ARM je použita technologie NEON, která dosti revolučním způsobem mění i konfiguraci interních bloků mikroprocesorů, zavádí přibližně 100 nových instrukcí SIMD a taktéž rozšiřuje původní sadu pracovních registrů o 32 nových registrů, z nichž každý má šířku 64 bitů. Při návrhu technologie NEON se její tvůrci zaměřili na implementaci těch operací, které se v praxi skutečně provádí, takže je například poměrně snadné (a především efektivní) pracovat s různými formáty rastrových bitmap, zpracovávat 16bitové zvukové vzorky při práci se stereo signálem atd. V rámci technologie NEON byla původní sada registrů mikroprocesorů ARM rozšířena o 32 nových 64bitových registrů nazvaných d0d31. Tyto registry se mohou u některých instrukcí sdružovat do párů a vytvářet tak sadu 128bitových registrů nazvaných q0q15 (d0+d1 vytvoří registr q0 atd.)

Vidíme, že vektorové (SIMD) operace nejsou v oblasti RISCových (ale ani CISCových) mikroprocesorů žádnou novinkou. To samé platí i pro PowerPC a AltiVec. V navazujících kapitolách si možnosti AltiVecu popíšeme podrobněji.

3. Sada registrů určená pro vektorové operace na procesorech PowerPC

Po shrnutí základních vlastností rozšíření vektorových instrukčních sad ve vybraných „konkurenčních“ RISCových mikroprocesorech se nyní konečně můžeme vrátit k popisu architektury AltiVec. Pokud mikroprocesory PowerPC toto rozšíření podporují, rozšiřuje se nám již známá sada pracovních registrů o dalších 34 registrů. Základní charakteristiky těchto nových registrů jsou shrnuty v následující tabulce:

# Zkratka Bitová šířka Význam zkratky Stručný popis
1 VR0..VR31 (později až VR63) 128 bitů Vector Register (32 nebo 64 registrů) používaných jako zdroj a cíl většiny vektorových operací
2 VSCR 32 bitů Vector Status and Control Register stavový a řídicí registr
3 VRSAVE 32 bitů VR Save Register určení, které VR0..VR31 je zapotřebí uložit při přepnutí kontextu

Poznámka: ze zkratkami registrů se setkáme jak v assembleru, tak i v debuggerech.

4. Vektorové pracovní registry VR0 až VR31

Programátor běžných aplikací běžících v uživatelském prostoru se setká především s první sadou nových (pracovních) registrů, které jsou v assembleru či debuggerech označovány zkratkami VR0VR31. Každý z těchto třiceti dvou registrů má šířku 128 bitů a může obsahovat několik prvků vektorů. Počet prvků, které lze uložit do 128 bitů, je samozřejmě odvozen od jejich šířky, takže se může v extrémních případech jednat o jediný prvek (quad word), ale též o šestnáct prvků (unsigned/signed byte). Původní originální návrh technologie AltiVec počítal skutečně s použitím třiceti dvou nových vektorových pracovních registrů (tak, jak je to popsáno v Power ISA v2.03), ovšem v rámci novější specifikace Power ISA v2.06 se tato sada rozšířila na 64 registrů. Navíc ještě existuje ne zcela kompatibilní rozšíření VMX128 se 128 registry. Toto rozšíření bylo použito v procesoru Xenon ve známé herní konzoli Xbox 360 (podrobnější popis tohoto zajímavého čipu si pravděpodobně vyžádá samostatný článek).

5. VSCR – Vector Status and Control Register

Na druhém řádku tabulky vidíme registr nazvaný VSCR neboli Vector Status and Control Register. Jedná se o 32bitový registr, v němž je ovšem ve skutečnosti využito pouze několik bitů, takže si inženýři nechali prostor pro další bezproblémové rozšiřování. Jedním bitem je řízen režim činnosti vektorového procesoru při zpracování hodnot s plovoucí řádovou čárkou – lze povolit či zakázat použití režimu plně kompatibilního se specifikací Javy (meziukládání výsledků, modifikátor strictfp atd.). Další bit je použit při provádění aritmetických operací se saturací. Pokud k saturaci dojde, je tento bit nastaven na jedničku a zůstane tak nastaven až do doby, kdy je programově (tedy explicitně) vynulován. Tím se chování tohoto bitu odlišuje od klasických stavových (příznakových) bitů. Pro přenos dat mezi registrem VSCR a vybraným vektorovým registrem VR0..31 slouží instrukce nazvané mfvscr a mtvscr, které samozřejmě zpracovávají jen 32 bitů (ostatní bity VR0..31 jsou vynulovány).

6. Vyřešení problému s přepínáním kontextu: registr VRSAVE

Při přepínání kontextu mezi několika procesy či při volání služby jádra operačního systému atd. je nutné uložit (a následně obnovit) stav pracovních i stavových registrů procesoru. Týká se to i vektorových registrů VR0..VR31, což však může potenciálně vést k výkonnostním problémům, protože je teoreticky nutné přenést 32×128=4096 bitů (512 bajtů) při každém přepnutí kontextu. Aby se tato hodnota snížila, je v technologii AltiVec použit speciální registr nazvaný příznačně VRSAVE. Tento registr má šířku 32 bitů a obsahuje bitové příznaky určující, které vektorové registry VR0..VR31 se mají skutečně uložit a které je naopak možné ignorovat (pro každý vektorový registr je tedy ve VRSAVE rezervován jediný bit). Jedná se o poměrně elegantní řešení celého problému, protože překladač (nebo i programátor) má v každém okamžiku přesné informace o tom, jak jsou jednotlivé registry využity (tuto informaci má již v době překladu, pokud se samozřejmě nebavíme o JIT).

7. Podporované formáty vektorů

Již v předchozích kapitolách jsme si řekli, že vektorové registry mají šířku 128 bitů. Do těchto 128 bitů je možné uložit různé typy prvků; vektor však vždy obsahuje prvky stejného typu. Podporovány jsou následující formáty:

Typ prvku Bitová šířka Počet prvků ve vektoru
unsigned byte 8 bitů 16
signed byte 8 bitů 16
unsigned half word 16 bitů 8
signed half word 16 bitů 8
unsigned word 32 bitů 4
signed word 32 bitů 4
unsigned quad word 128 bitů 1
signed quad word 128 bitů 1
float/single 32 bitů 4

Formát rozdělení 128bitového vektorového registru si můžeme naznačit i následujícím způsobem:

 
+-------------------------------------------------------------------------------+
|                                    quadword                                   |
+-------------------+-------------------+-------------------+-------------------+
|      float0       |      float1       |      float2       |      float3       |
+-------------------+-------------------+-------------------+-------------------+
|       word0       |       word1       |       word2       |       word3       |
+---------+---------+---------+---------+---------+---------+---------+---------+
|  half0  |  half1  |  half2  |  half3  |  half4  |  half5  |  half6  |  half7  |
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
| b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7 | b8 | b9 | b10|b11 |b12 |b13 |b14 |b15 |
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
:                                                                               :
:                                                                               :
:                                                                               :
bit0                                                                          bit127
 

8. Blok Vector Permute Unit (VPU)

Některé čipy s architekturu PowerPC (G4 atd.) neprovádí vektorové operace v jediném monolitickém „vektorovém procesoru“, ale ve větším množství modulů, které mohou při dodržení určitých podmínek pracovat samostatně a nezávisle na ostatních modulech. Prvním blokem je Vector Permute Unit neboli zkráceně VPU. V tomto modulu se provádí operace konverze vektorů, dosazení konstant do prvků vektorů, permutace prvků (velmi užitečná a přitom univerzálně použitelná instrukce) atd. Důležité je, že tento modul může běžet skutečně nezávisle na dalších modulech (a tedy provádět instrukce téměř paralelně, přesněji řečeno tak rychle, jak jsou vkládány do pipeline), ovšem pouze za předpokladu, že nedojde ke kolizi použitých registrů s jiným modulem (zápis či čtení ze shodných registrů). O to, aby ke kolizím nedocházelo, nebo aby k nim docházelo jen s nízkou frekvencí, se musí postarat překladač, kterému samozřejmě pomáhá fakt, že má k dispozici plných 32 vektorových registrů.

9. Blok Vector Arithmetic Logic Unit (VALU)

Druhým blokem vektorového procesoru je VALU neboli Vector Arithmetic Logic Unit. V tomto bloku se provádí většina operací nad prvky vektorů a vzhledem k tomu, že jsou podporovány jak celočíselné operace, tak i operace s plovoucí řádovou čárkou, rozděluje se VALU do několika jednotek:

# Jednotka Plné jméno Význam
1 VSIU vector simple integer unit součet, rozdíl, průměr, rotace, porovnání
2 VCIU vector complex integer unit delší instrukce typu násobení a dělení, MAC atd.
3 VFPU vector floating-point unit všechny FP operace

Důvodem pro rozdělení na VSIU a VCIU je fakt, že VSIU je realizován jedním řezem pipeline, kdežto VCIU minimálně třemi řezy (větší latence).

10. Instrukce pro načtení či uložení vektorů

Pro načtení či uložení prvků vektorů slouží osm instrukcí, které jsou vypsány v následující tabulce:

# Instrukce Popis
1 lvebx načtení bajtu
2 lvehx načtení polovičního slova (half word)
3 lvewx načtení celého slova či typu float
4 lvx načtení vektoru (quad word)
5 stvebx uložení bajtu
6 stvehx uložení polovičního slova (half word)
7 stvewx uložení celého slova či typu float
8 stvx uložení vektoru (quad word)

V instrukčním slovu o šířce 32 bitů se nachází tři bitová pole, která slouží pro specifikaci zdrojového či cílového vektorového registru a taktéž pro určení dvou pracovních registrů použitých pro adresování prvků v operační paměti. Se způsobem adresování jsme se již setkali:

  1. Pokud je index prvního registru RA roven nule, je adresa určena přímo druhým registrem RB
  2. Pokud je index prvního registru RA nenulový, je adresa určena součtem RA+RB

Navíc se ještě spodních n-bitů adresy používá pro určení indexu prvku vektoru, který se má načíst/uložit (pro tento účel nám postačují čtyři bity).

11. Celočíselné vektorové operace

Podívejme se nyní na základní celočíselné operace prováděné s prvky uloženými ve vektorech. Většina instrukcí obsahuje ve svém instrukčním slovu specifikaci dvou zdrojových vektorových registrů a jednoho registru cílového (jedná se tedy o takzvaný tříadresový kód):

# Instrukce Popis
1 vaddcuw součet slov (bez znaménka)
2 vaddubm součet bajtů (bez znaménka) s přetečením
3 vadduhm dtto pro typ halfword (16 bitů)
4 vadduwm dtto pro typ word (32 bitů)
     
5 vsubcuw rozdíl slov (bez znaménka)
6 vsububm rozdíl bajtů (bez znaménka) s přetečením
7 vsubuhm dtto pro typ halfword (16 bitů)
8 vsubuwm dtto pro typ word (32 bitů)
     
9 vmulesb součin bajtů (sudé prvky vektorů – výsledkem jsou 16bitové hodnoty)
10 vmuleub dtto, ale bez znaménka
11 vmulesh součin halfword (sudé prvky vektorů – výsledkem jsou 32bitové hodnoty)
12 vmuleuh dtto, ale bez znaménka
13 vmulosb součin bajtů (liché prvky vektorů – výsledkem jsou 16bitové hodnoty)
14 vmuloub dtto, ale bez znaménka
15 vmulosh součin halfword (liché prvky vektorů – výsledkem jsou 32bitové hodnoty)
16 vmulouh dtto, ale bez znaménka

U operací násobení je výsledek uložen ve dvojnásobném počtu bitů. Je to ostatně logické, protože například prvek typu unsigned byte může obsahovat maximální hodnotu 255 a součin 255×255=65025, což je hodnota, pro jejíž reprezentaci potřebujeme minimálně šestnáct bitů. Proto jsou výsledky vždy uloženy ve dvou sousedních prvcích vektorů; resp. se provede konverze byte→halfword→word.

12. Saturace v celočíselných operacích

Mnoho aritmetických operací existuje ve dvou variantách. V první variantě zmíněné v předchozí kapitole mohou výsledky přetékat, což například znamená, že ve chvíli, kdy se sčítají prvky typu unsigned byte a mají se sečíst dva prvky s hodnotami 200 a 100, je výsledkem hodnota 44 a nikoli 300. Při saturaci je naopak výsledkem maximální reprezentovatelná hodnota, tedy 255:

CS24 tip temata

# Instrukce Popis
1 vaddsbs součet bajtů (se znaménkem) se saturací
2 vaddshs dtto pro typ halfword (16 bitů)
3 vaddsws dtto pro typ word (32 bitů)
4 vaddubs součet bajtů (bez znaménka) se saturací
5 vadduhs dtto pro typ halfword (16 bitů)
6 vadduws dtto pro typ word (32 bitů)
     
7 vsubsbs rozdíl bajtů (se znaménkem) se saturací
8 vsubshs dtto pro typ halfword (16 bitů)
9 vsubsws dtto pro typ word (32 bitů)
10 vsububs rozdíl bajtů (bez znaménka) se saturací
11 vsubuhs dtto pro typ halfword (16 bitů)
12 vsubuws dtto pro typ word (32 bitů)

13. Jména instrukcí

Jména instrukcí určených pro operaci s vektory jsou sice velmi dlouhá, ale jsou (většinou) sestavená logicky:

  1. První písmeno je ve všech případech v, pochopitelně od slova vector.
  2. Následuje jméno operace, například add či sub.
  3. Písmeno u značí typ unsigned, s pak signed (ovšem pokud se nepoužije saturace, není v prováděných operacích žádný rozdíl).
  4. Písmeno e značí sudé prvky (even), o pak liché prvky (odd), což platí například pro operace násobení, kdy je výsledek uložen v dvojnásobném počtu bitů.
  5. Další znak označuje typ – byte, halfword či word.
  6. Pokud je posledním písmenem m, jedná se o operaci typu „modulo“, tedy s případným přetečením výsledků.

14. Obsah druhého pokračování článku

Ve druhé (a současně i závěrečné) části tohoto článku popis technologie AltiVec dokončíme. Věnovat se budeme různým instrukcím určeným pro permutaci prvků ve vektorech (permute, merge, splat, select), dále pak instrukcím pracujícím se speciálním typem „pixel“ (to je dosti zajímavá část AltiVecu) a samozřejmě nezapomeneme ani na zbývající aritmetické instrukce typu MAC (Multiply and Accumulate), operace s hodnotami s plovoucí řádovou čárkou atd.

15. Odkazy na Internetu

  1. G4 Overview
    https://www.cs.umd.edu/clas­s/fall2001/cmsc411/proj01/g4/
  2. Unrolling AltiVec, Part 1: Introducing the PowerPC SIMD unit
    http://www.ibm.com/develo­perworks/library/pa-unrollav1/index.html
  3. SIMD architectures
    http://arstechnica.com/fe­atures/2000/03/simd/
  4. Procesory RISC v pracovních stanicích a serverech – architektura SPARC V8 a
    http://www.root.cz/clanky/procesory-risc-v-pracovnich-stanicich-a-serverech-architektura-sparc-v8-a-v9/
  5. Procesory RISC v pracovních stanicích a serverech – architektura PA-RISC
    http://www.root.cz/clanky/procesory-risc-v-pracovnich-stanicich-a-serverech-architektura-pa-risc/
  6. Rozšíření instrukční sady procesorových jader s otevřenou architekturou RISC-V
    http://www.root.cz/clanky/rozsireni-instrukcni-sady-procesorovych-jader-s-otevrenou-architekturou-risc-v/
  7. Práce s hodnotami s plovoucí řádovou čárkou na mikroprocesorech ARM
    http://www.root.cz/clanky/prace-s-hodnotami-s-plovouci-radovou-carkou-na-mikroprocesorech-arm/
  8. Simplified PowerPC Instruction Set
    http://www.ds.ewi.tudelft­.nl/vakken/in101/labcourse/in­struction-set/
  9. Assembly language for Power Architecture, Part 1: Programming concepts and beginning PowerPC instructions
    http://www.ibm.com/develo­perworks/linux/library/l-powasm1/index.html
  10. Assembly language for Power Architecture, Part 2: The art of loading and storing on PowerPC
    http://www.ibm.com/develo­perworks/linux/library/l-powasm2/index.html
  11. Assembly language for Power Architecture, Part 3: Programming with the PowerPC branch processor
    http://www.ibm.com/develo­perworks/library/l-powasm3/index.html
  12. Assembly language for Power Architecture, Part 4: Function calls and the PowerPC 64-bit ABI
    http://www.ibm.com/develo­perworks/linux/library/l-powasm4/index.html
  13. PowerPC overview (poněkud starší materiály z roku 2006)
    http://titancity.com/arti­cles/ppc.html
  14. PowerPC (Wikipedia)
    https://en.wikipedia.org/wiki/PowerPC
  15. Status Register
    https://en.wikipedia.org/wi­ki/Status_register
  16. Why Learn Assembly Language?
    http://www.codeproject.com/Ar­ticles/89460/Why-Learn-Assembly-Language
  17. Is Assembly still relevant?
    http://programmers.stackex­change.com/questions/95836/is-assembly-still-relevant
  18. Why Learning Assembly Language Is Still a Good Idea
    http://www.onlamp.com/pub/a/on­lamp/2004/05/06/writegreat­code.html
  19. Assembly language today
    http://beust.com/weblog/2004/06/23/as­sembly-language-today/
  20. RISC-V Draft Sompressed ISA Version 1.9 Released
    https://blog.riscv.org/2015/11/risc-v-draft-compressed-isa-version-1–9-released/
  21. RISC vs. CISC: the Post-RISC Era
    http://archive.arstechnica­.com/cpu/4q99/risc-cisc/rvc-1.html
  22. Introduction to ARM Thumb
    http://www.embedded.com/electronics-blogs/beginner-s-corner/4024632/Introduction-to-ARM-thumb
  23. Code Size – a comprehensive comparison of microMIPS32 and Thumb code size using many Megabytes of customer code
    https://community.arm.com/grou­ps/processors/blog/2014/04/28/co­de-size-a-comprehensive-comparison-of-micromips32-and-thumb-code-size-using-many-megabytes-of-customer-code
  24. MIPS MCUs Outrun ARM
    http://www.linleygroup.com/new­sletters/newsletter_detail­.php?num=5117
  25. Improving Energy Efficiency and Reducing Code Size with RISC-V Compressed
    http://www.eecs.berkeley.e­du/~waterman/papers/ms-thesis.pdf
  26. An Introduction to Lock-Free Programming
    http://preshing.com/20120612/an-introduction-to-lock-free-programming/
  27. Sequential consistency
    https://en.wikipedia.org/wi­ki/Sequential_consistency
  28. Understanding Atomic Operations
    https://jfdube.wordpress.com/2011/11/30/un­derstanding-atomic-operations/
  29. Load-link/store-conditional
    https://en.wikipedia.org/wiki/Load-link/store-conditional
  30. The RISC-V Compressed Instruction Set Manual (Pozor: verze 1.7)
    http://riscv.org/spec/riscv-compressed-spec-v1.7.pdf
  31. Carry bits, The Architect's Trap
    http://yarchive.net/comp/ca­rry_bit.html
  32. Microprocessor Design/ALU Flags
    https://en.wikibooks.org/wi­ki/Microprocessor_Design/A­LU_Flags
  33. Flags register in an out-of-order processor
    http://cs.stackexchange.com/qu­estions/42095/flags-register-in-an-out-of-order-processor
  34. AMD Am29000
    https://en.wikipedia.org/wi­ki/AMD_Am29000
  35. Status register
    https://en.wikipedia.org/wi­ki/Status_register
  36. AMD Am29000 microprocessor family
    http://www.cpu-world.com/CPUs/29000/
  37. AMD 29k (Streamlined Instruction Processor) ID Guide
    http://www.cpushack.com/Am29k.html
  38. AMD Am29000 (Wikipedia)
    http://en.wikipedia.org/wi­ki/AMD_Am29000
  39. AMD K5 („K5“ / „5k86“)
    http://www.pcguide.com/ref/cpu/fam/g5K5-c.html
  40. Comparing four 32-bit soft processor cores
    http://www.eetimes.com/au­thor.asp?section_id=14&doc_id=1286116
  41. RISC-V Instruction Set
    http://riscv.org/download­.html#spec_compressed_isa
  42. RISC-V Spike (ISA Simulator)
    http://riscv.org/download.html#isa-sim
  43. RISC-V (Wikipedia)
    https://en.wikipedia.org/wiki/RISC-V
  44. David Patterson (Wikipedia)
    https://en.wikipedia.org/wi­ki/David_Patterson_(compu­ter_scientist)
  45. OpenRISC (oficiální stránky tohoto projektu)
    http://openrisc.io/
  46. OpenRISC architecture
    http://openrisc.io/architecture.html
  47. Emulátor OpenRISC CPU v JavaScriptu
    http://s-macke.github.io/jor1k/demos/main.html
  48. OpenRISC (Wikipedia)
    https://en.wikipedia.org/wi­ki/OpenRISC
  49. OpenRISC – instrukce
    http://sourceware.org/cgen/gen-doc/openrisc-insn.html
  50. OpenRISC – slajdy z přednášky o tomto projektu
    https://iis.ee.ethz.ch/~gmichi/a­socd/lecturenotes/Lecture6­.pdf
  51. Maska mikroprocesoru RISC 1
    http://www.cs.berkeley.edu/~pat­trsn/Arch/RISC1.jpg
  52. Maska mikroprocesoru RISC 2
    http://www.cs.berkeley.edu/~pat­trsn/Arch/RISC2.jpg
  53. C.E. Sequin and D.A.Patterson: Design and Implementation of RISC I
    http://www.eecs.berkeley.e­du/Pubs/TechRpts/1982/CSD-82–106.pdf
  54. Berkeley RISC
    http://en.wikipedia.org/wi­ki/Berkeley_RISC
  55. Great moments in microprocessor history
    http://www.ibm.com/develo­perworks/library/pa-microhist.html
  56. Microprogram-Based Processors
    http://research.microsoft.com/en-us/um/people/gbell/Computer_Struc­tures_Principles_and_Exam­ples/csp0167.htm
  57. Great Microprocessors of the Past and Present
    http://www.cpushack.com/CPU/cpu1.html
  58. A Brief History of Microprogramming
    http://www.cs.clemson.edu/~mar­k/uprog.html
  59. What is RISC?
    http://www-cs-faculty.stanford.edu/~ero­berts/courses/soco/projec­ts/2000–01/risc/whatis/
  60. RISC vs. CISC
    http://www-cs-faculty.stanford.edu/~ero­berts/courses/soco/projec­ts/2000–01/risc/risccisc/
  61. RISC and CISC definitions:
    http://www.cpushack.com/CPU/cpu­AppendA.html
  62. FPGA
    https://cs.wikipedia.org/wi­ki/Programovateln%C3%A9_hra­dlov%C3%A9_pole
  63. The Evolution of RISC
    http://www.ibm.com/develo­perworks/library/pa-microhist.html#sidebar1
  64. SPARC Processor Family Photo
    http://thenetworkisthecom­puter.com/site/?p=243
  65. SPARC: Decades of Continuous Technical Innovation
    http://blogs.oracle.com/on­therecord/entry/sparc_deca­des_of_continuous_technical
  66. The SPARC processors
    http://www.top500.org/2007_o­verview_recent_supercompu­ters/sparc_processors
  67. Reduced instruction set computing (Wikipedia)
    http://en.wikipedia.org/wi­ki/Reduced_instruction_set_com­puter
  68. MIPS architecture (Wikipedia)
    http://en.wikipedia.org/wi­ki/MIPS_architecture
  69. Very long instruction word (Wikipedia)
    http://en.wikipedia.org/wi­ki/Very_long_instruction_word
  70. Classic RISC pipeline (Wikipedia)
    http://en.wikipedia.org/wi­ki/Classic_RISC_pipeline
  71. R2000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wi­ki/R2000_(microprocessor)
  72. R3000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R3000
  73. R4400 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R4400
  74. R8000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R8000
  75. R10000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R10000
  76. SPARC (Wikipedia)
    http://en.wikipedia.org/wiki/Sparc
  77. CPU design (Wikipedia)
    http://en.wikipedia.org/wi­ki/CPU_design
  78. Control unit (Wikipedia)
    http://en.wikipedia.org/wi­ki/Control_unit

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.