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
14. Obsah druhého pokračování článku
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í:
- 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.
- 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.).
- 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.
- 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 GR1 až GR31, 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.
- 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í.
- 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.
- 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).
- 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 d0 až d31. Tyto registry se mohou u některých instrukcí sdružovat do párů a vytvářet tak sadu 128bitových registrů nazvaných q0 až q15 (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 VR0 až VR31. 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:
- Pokud je index prvního registru RA roven nule, je adresa určena přímo druhým registrem RB
- 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:
# | 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:
- První písmeno je ve všech případech v, pochopitelně od slova vector.
- Následuje jméno operace, například add či sub.
- 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).
- 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ů.
- Další znak označuje typ – byte, halfword či word.
- 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
- G4 Overview
https://www.cs.umd.edu/class/fall2001/cmsc411/proj01/g4/ - Unrolling AltiVec, Part 1: Introducing the PowerPC SIMD unit
http://www.ibm.com/developerworks/library/pa-unrollav1/index.html - SIMD architectures
http://arstechnica.com/features/2000/03/simd/ - 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/ - 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/ - 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/ - 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/ - Simplified PowerPC Instruction Set
http://www.ds.ewi.tudelft.nl/vakken/in101/labcourse/instruction-set/ - Assembly language for Power Architecture, Part 1: Programming concepts and beginning PowerPC instructions
http://www.ibm.com/developerworks/linux/library/l-powasm1/index.html - Assembly language for Power Architecture, Part 2: The art of loading and storing on PowerPC
http://www.ibm.com/developerworks/linux/library/l-powasm2/index.html - Assembly language for Power Architecture, Part 3: Programming with the PowerPC branch processor
http://www.ibm.com/developerworks/library/l-powasm3/index.html - Assembly language for Power Architecture, Part 4: Function calls and the PowerPC 64-bit ABI
http://www.ibm.com/developerworks/linux/library/l-powasm4/index.html - PowerPC overview (poněkud starší materiály z roku 2006)
http://titancity.com/articles/ppc.html - PowerPC (Wikipedia)
https://en.wikipedia.org/wiki/PowerPC - Status Register
https://en.wikipedia.org/wiki/Status_register - Why Learn Assembly Language?
http://www.codeproject.com/Articles/89460/Why-Learn-Assembly-Language - Is Assembly still relevant?
http://programmers.stackexchange.com/questions/95836/is-assembly-still-relevant - Why Learning Assembly Language Is Still a Good Idea
http://www.onlamp.com/pub/a/onlamp/2004/05/06/writegreatcode.html - Assembly language today
http://beust.com/weblog/2004/06/23/assembly-language-today/ - RISC-V Draft Sompressed ISA Version 1.9 Released
https://blog.riscv.org/2015/11/risc-v-draft-compressed-isa-version-1–9-released/ - RISC vs. CISC: the Post-RISC Era
http://archive.arstechnica.com/cpu/4q99/risc-cisc/rvc-1.html - Introduction to ARM Thumb
http://www.embedded.com/electronics-blogs/beginner-s-corner/4024632/Introduction-to-ARM-thumb - Code Size – a comprehensive comparison of microMIPS32 and Thumb code size using many Megabytes of customer code
https://community.arm.com/groups/processors/blog/2014/04/28/code-size-a-comprehensive-comparison-of-micromips32-and-thumb-code-size-using-many-megabytes-of-customer-code - MIPS MCUs Outrun ARM
http://www.linleygroup.com/newsletters/newsletter_detail.php?num=5117 - Improving Energy Efficiency and Reducing Code Size with RISC-V Compressed
http://www.eecs.berkeley.edu/~waterman/papers/ms-thesis.pdf - An Introduction to Lock-Free Programming
http://preshing.com/20120612/an-introduction-to-lock-free-programming/ - Sequential consistency
https://en.wikipedia.org/wiki/Sequential_consistency - Understanding Atomic Operations
https://jfdube.wordpress.com/2011/11/30/understanding-atomic-operations/ - Load-link/store-conditional
https://en.wikipedia.org/wiki/Load-link/store-conditional - The RISC-V Compressed Instruction Set Manual (Pozor: verze 1.7)
http://riscv.org/spec/riscv-compressed-spec-v1.7.pdf - Carry bits, The Architect's Trap
http://yarchive.net/comp/carry_bit.html - Microprocessor Design/ALU Flags
https://en.wikibooks.org/wiki/Microprocessor_Design/ALU_Flags - Flags register in an out-of-order processor
http://cs.stackexchange.com/questions/42095/flags-register-in-an-out-of-order-processor - AMD Am29000
https://en.wikipedia.org/wiki/AMD_Am29000 - Status register
https://en.wikipedia.org/wiki/Status_register - AMD Am29000 microprocessor family
http://www.cpu-world.com/CPUs/29000/ - AMD 29k (Streamlined Instruction Processor) ID Guide
http://www.cpushack.com/Am29k.html - AMD Am29000 (Wikipedia)
http://en.wikipedia.org/wiki/AMD_Am29000 - AMD K5 („K5“ / „5k86“)
http://www.pcguide.com/ref/cpu/fam/g5K5-c.html - Comparing four 32-bit soft processor cores
http://www.eetimes.com/author.asp?section_id=14&doc_id=1286116 - RISC-V Instruction Set
http://riscv.org/download.html#spec_compressed_isa - RISC-V Spike (ISA Simulator)
http://riscv.org/download.html#isa-sim - RISC-V (Wikipedia)
https://en.wikipedia.org/wiki/RISC-V - David Patterson (Wikipedia)
https://en.wikipedia.org/wiki/David_Patterson_(computer_scientist) - OpenRISC (oficiální stránky tohoto projektu)
http://openrisc.io/ - OpenRISC architecture
http://openrisc.io/architecture.html - Emulátor OpenRISC CPU v JavaScriptu
http://s-macke.github.io/jor1k/demos/main.html - OpenRISC (Wikipedia)
https://en.wikipedia.org/wiki/OpenRISC - OpenRISC – instrukce
http://sourceware.org/cgen/gen-doc/openrisc-insn.html - OpenRISC – slajdy z přednášky o tomto projektu
https://iis.ee.ethz.ch/~gmichi/asocd/lecturenotes/Lecture6.pdf - Maska mikroprocesoru RISC 1
http://www.cs.berkeley.edu/~pattrsn/Arch/RISC1.jpg - Maska mikroprocesoru RISC 2
http://www.cs.berkeley.edu/~pattrsn/Arch/RISC2.jpg - C.E. Sequin and D.A.Patterson: Design and Implementation of RISC I
http://www.eecs.berkeley.edu/Pubs/TechRpts/1982/CSD-82–106.pdf - Berkeley RISC
http://en.wikipedia.org/wiki/Berkeley_RISC - Great moments in microprocessor history
http://www.ibm.com/developerworks/library/pa-microhist.html - Microprogram-Based Processors
http://research.microsoft.com/en-us/um/people/gbell/Computer_Structures_Principles_and_Examples/csp0167.htm - Great Microprocessors of the Past and Present
http://www.cpushack.com/CPU/cpu1.html - A Brief History of Microprogramming
http://www.cs.clemson.edu/~mark/uprog.html - What is RISC?
http://www-cs-faculty.stanford.edu/~eroberts/courses/soco/projects/2000–01/risc/whatis/ - RISC vs. CISC
http://www-cs-faculty.stanford.edu/~eroberts/courses/soco/projects/2000–01/risc/risccisc/ - RISC and CISC definitions:
http://www.cpushack.com/CPU/cpuAppendA.html - FPGA
https://cs.wikipedia.org/wiki/Programovateln%C3%A9_hradlov%C3%A9_pole - The Evolution of RISC
http://www.ibm.com/developerworks/library/pa-microhist.html#sidebar1 - SPARC Processor Family Photo
http://thenetworkisthecomputer.com/site/?p=243 - SPARC: Decades of Continuous Technical Innovation
http://blogs.oracle.com/ontherecord/entry/sparc_decades_of_continuous_technical - The SPARC processors
http://www.top500.org/2007_overview_recent_supercomputers/sparc_processors - Reduced instruction set computing (Wikipedia)
http://en.wikipedia.org/wiki/Reduced_instruction_set_computer - MIPS architecture (Wikipedia)
http://en.wikipedia.org/wiki/MIPS_architecture - Very long instruction word (Wikipedia)
http://en.wikipedia.org/wiki/Very_long_instruction_word - Classic RISC pipeline (Wikipedia)
http://en.wikipedia.org/wiki/Classic_RISC_pipeline - R2000 Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/R2000_(microprocessor) - R3000 Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/R3000 - R4400 Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/R4400 - R8000 Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/R8000 - R10000 Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/R10000 - SPARC (Wikipedia)
http://en.wikipedia.org/wiki/Sparc - CPU design (Wikipedia)
http://en.wikipedia.org/wiki/CPU_design - Control unit (Wikipedia)
http://en.wikipedia.org/wiki/Control_unit