Obsah
1. SIMD instrukce využívané v moderních mikroprocesorech
2. Instrukční sada MMX: první pokus o použití SIMD na platformě x86
3. Datové typy, s nimiž instrukce MMX pracují, aritmetické operace se saturací
4. Rozdělení MMX instrukcí do funkčních skupin
5. Registry používané jednotkou MMX
6. Instrukční sada 3DNow! aneb odpověď firmy AMD na instrukční sadu MMX
7. Datové typy instrukcí 3DNow!
1. SIMD instrukce využívané v moderních mikroprocesorech
V předchozí části seriálu o architekturách počítačů jsme se seznámili s takzvanými vektorovými procesory a taktéž jsme se zmínili o Flynnově klasifikaci (rozdělení) sekvenčních a paralelních systémů do čtyř skupin označovaných většinou zkratkami SISD, SIMD, MISD a MIMD. Řekli jsme si, že v kategorii SIMD můžeme nalézt jak superpočítače zpracovávající i poměrně dlouhé vektory čísel, tak i mnohé moderní mikroprocesory, popř. GPU používané na soudobých grafických akcelerátorech. Dnes se zaměříme na popis a vzájemné porovnání dvou instrukčních sad (přesněji řečeno rozšíření původní instrukční sady) určených pro platformu x86. Prvním rozšířením instrukční sady x86 je skupina instrukcí MMX, která byla navržena a poprvé implementována ve firmě Intel. Druhým rozšířením instrukční sady je skupina instrukcí 3DNow! od konkurenční společnosti AMD, díky níž se původní rozšířená „celočíselná“ instrukční sada MMX doplnila o cca dvě desítky nových instrukcí pracujících převážně s numerickými hodnotami s plovoucí řádovou čárkou.
Obrázek 1: Zpracování obrazového signálu při jeho převodu do formátu JFIF (JPEG), kde je mj. použita i diskrétní kosinová transformace (DCT). Podobné blokové schéma lze najít u čipů pro komprimaci videa podle normy MPEG.
Jak instrukční sada MMX, tak i její vylepšení 3DNow! měly i přes některé diskutabilní vlastnosti, o nichž se zmíníme později, poměrně velký vliv na vznik dalších rozšíření původně skalární instrukční sady x86 o SIMD („vektorové“) operace. Na platformě x86 se jedná především o instrukční sady SSE, SSE2, SSE3, SSE4 atd., jejichž stručným popisem a porovnáním se budeme zabývat v některém z následujících pokračování tohoto seriálu. Způsob využití SIMD instrukcí samozřejmě závisí na charakteru aplikace, takže se s těmito instrukcemi můžeme například setkat v audio a video kodecích (zpracování datových toků), aplikacích provádějících 2D a 3D grafické operace atd. V těchto případech totiž použití SIMD instrukcí vede mnohdy i k několikanásobnému urychlení výpočtů, na rozdíl od běžných aplikací pracujících spíše se složitými hierarchickými datovými strukturami, kde nemusí být vliv SIMD instrukcí na dosažený výpočetní výkon žádný nebo jen velmi malý.
Obrázek 2: Schéma FIR filtru.
2. Instrukční sada MMX: první pokus o použití SIMD na platformě x86
První rozšiřující instrukční sadou obsahující SIMD operace, kterou si v tomto článku alespoň stručně popíšeme, je sada instrukcí nazvaná MMX (MultiMedia eXtension, později taktéž rozepisováno jako Matrix Math eXtension). Tato sada byla navržena v roce 1996 ve firmě Intel a od roku 1997 jí začaly být vybavovány prakticky všechny nové procesory této firmy, které patřily do rodiny x86 (připomeňme si, že se jednalo o 32bitové mikroprocesory, protože k rozšíření na 64bitovou ALU došlo u mainstreamových čipů až o několik let později). Prvním procesorem s podporou MMX byl čip Pentium P55C nabízený od začátku roku 1997. Později došlo k implementaci MMX i na čipy Pentium II a procesory konkurenčních společností, konkrétně na čipy AMD K6 a taktéž na Cyrix M2 (6×86MX) a IDT C6. Na tomto místě je nutné říci, že se vlastně nejednalo o nijak přelomovou technologii, protože v instrukční sadě MMX jsou použity instrukce analogické instrukcím ze SPARC VIS (VIS=Visual Instruction Set), MIPS MDMX či HP-PA MAX-1 a HP-PA MAX-2 (opět se tedy jedná o technologii inspirovanou RISCovými procesory).
Obrázek 3: Jedna z poměrně složitých, ale užitečných instrukcí z instrukční sady MMX. Jedná se o instrukci PMADDWD, která provádí paralelní součin čtveřice šestnáctibitových hodnot s 32 bitovým mezivýsledkem, s následným součtem prvního + druhého a třetího + čtvrtého mezivýsledku. Tuto instrukci lze použít například při implementaci konvolučních filtrů.
(Zdroj: Intel MMXTM Technology Overview, Intel corporation, 1996)
Jedním z důvodů zavedení těchto nových instrukcí byla snaha firmy Intel o konstrukci osobních počítačů s minimálním množstvím specializovaných čipů na základní desce i na přídavných kartách. Většinu operací měl totiž provádět samotný mikroprocesor, ať již se jednalo o zpracování zvuku (softwarový mix), ovládání periferních zařízení (programová implementace bufferů atd.) tak i o softwarovou implementaci kodeků, včetně kodeků používaných v modemech (právě v té době došlo k rozvoji takzvaných softwarových modemů, jejichž příslušenství se zúžilo na pouhé rozhraní pro analogovou telefonní linku). V rámci instrukční sady MMX se na původně prakticky ryze skalární platformu x86 přidalo celkem 57 nových instrukcí a čtyři datové typy, které byly těmito instrukcemi podporovány. Jeden z nově zaváděných datových typů je skalární, další tři nové datové typy jsou představovány dvouprvkovým, čtyřprvkovým a osmiprvkovým vektorem (viz též podrobnější popis uvedený v navazující kapitole).
Obrázek 4: Ukázka jednoho typu konverzní funkce, kterých se v instrukční sadě MMX nachází několik.
(Zdroj: Intel MMXTM Technology Overview, Intel corporation, 1996)
3. Datové typy, s nimiž instrukce MMX pracují, aritmetické operace se saturací
Většina nových instrukcí přidaných v rámci sady MMX byla určena pro provádění aritmetických a bitových operací s celočíselnými operandy o šířce 8, 16, 32 či 64 bitů, což pokrývá poměrně širokou oblast multimediálních dat – osmibitových i šestnáctibitových zvukových vzorků (samplů), barev pixelů (RGB, RGBA) atd. Zatímco při provádění aritmetických operací s využitím klasické aritmeticko-logické jednotky mohlo docházet k přetečení či podtečení hodnot při provádění instrukcí typu ADD či SUB (součet, rozdíl), je možné u MMX instrukcí zvolit i takzvanou aritmetiku se saturací, což znamená, že v případě přetečení se do výsledku uloží maximální reprezentovatelná hodnota a naopak při podtečení minimální hodnota, což je například při zpracování signálu (většinou) žádoucí chování, V následující tabulce jsou vypsány nově podporované datové typy i způsob jejich uložení ve slovech o šířce 64 bitů, které jsou zpracovávány jednotkou MMX:
Datový typ | Bitová šířka operandu | Počet prvků vektoru |
---|---|---|
packed byte | 8 bitů | 8 |
packed word | 16 bitů | 4 |
packed doubleword | 32 bitů | 2 |
quadword | 64 bitů | 1 |
Obrázek 5: Ukázka chování MMX instrukce PADDW, která provádí součet čtveřice šestnáctibitových hodnot s přetečením, což je patrné z posledního sloupce.
(Zdroj: Intel MMXTM Technology Overview, Intel corporation, 1996)
Kromě přímé manipulace s celočíselnými hodnotami bylo relativně snadné pracovat i s numerickými hodnotami ukládanými ve formátu s pevnou řádovou čárkou (FX – fixed point), mohlo se například jednat o formáty 8.8 (osm bitů pro uložení celé části a osm bitů za řádovou čárkou), 8.24, 24.8 atd. O případné bitové posuny při normalizaci numerických hodnot se v tomto případě musel starat programátor. Tyto formáty byly a jsou využívány v některých algoritmech implementujících FFT (rychlou Fourierovu transformaci využívanou v mnoha algoritmech pro zpracování signálů), DCT (diskrétní kosinovou transformaci využívanou například ve formátu JFIF-JPEG), FIR, IIR (filtry s konečnou a nekonečnou impulsní odezvou), operacemi nad vektory či operacemi nad maticemi.
Obrázek 6: MMX instrukce PADDUSW, která sice také provádí součet čtveřice šestnáctibitových hodnot, ovšem součet je proveden se saturací – v případě, že se výsledek součtu již nemůže reprezentovat šestnáctibitovou hodnotou, uloží se namísto výsledku hodnota 0×FFFF, tj. nejvyšší šestnáctibitové celé číslo bez znaménka.
(Zdroj: Intel MMXTM Technology Overview, Intel corporation, 1996)
4. Rozdělení MMX instrukcí do funkčních skupin
Všech 57 instrukcí v instrukční sadě MMX lze rozdělit podle jejich funkce do několika skupin vypsaných v následující tabulce:
# | Skupina instrukcí | Příklady instrukcí |
---|---|---|
1 | Základní aritmetické operace | PADD, PADDS, PADDUS, PSUBS, PSUBUS, PMULHW, PMULLW |
2 | Logické (bitové) operace | PAND, PANDN, POR, PXOR |
3 | Bitové posuny | PSLL, PSRL, PSRA |
4 | Porovnávání | PCMPEQ, PCMGT |
5 | Konverze dat | PACKUSWB, PACKSS, PUNPCKH, PUNPCKL |
6 | Přenosy dat + práce s pamětí | MOV |
7 | Řízení jednotky MMX | EMMS |
Obrázek 7: Zdrojový rastrový obrázek (známá fotografie Lenny), který tvoří zdroj pro jednoduchý konvoluční (FIR) filtr, jenž zvyšuje hodnoty pixelů o pevně zadanou konstantu (offset).
Většina instrukcí uvedených v předchozí tabulce má navíc několik variant v závislosti na tom, s jakými operandy má instrukce ve skutečnosti pracovat. Například u instrukce PADD (součet) je možné zvolit, zda se mají sečíst dva osmiprvkové vektory, kde každý prvek má šířku 8 bitů, zda se má provést součet dvou čtyřprvkových vektorů (16bitové prvky), dvou dvouprvkových vektorů (32bitové prvky) či zda se jedná o součet dvojice 64bitových skalárních hodnot. To tedy znamená, že instrukce PADD může být reprezentována čtveřicí operačních kódů:
# | Instrukce | Význam |
---|---|---|
1 | PADDB | součet dvou vektorů majících osm osmibitových prvků |
2 | PADDW | součet dvou vektorů majících čtyři šestnáctibitové prvky |
3 | PADDD | součet dvou vektorů majících dva 32bitové prvky |
4 | PADDQ | součet dvou 64bitových skalárních hodnot |
Výjimkou z výše uvedeného pravidla jsou instrukce PAND, PANDN, POR a PXOR, pomocí nichž lze provádět bitové operace s dvojicí 64bitových slov. Důvod, proč není zapotřebí tyto instrukce dále rozdělovat podle počtu a šířky prvků vektorů, je zřejmý – tyto operace pracují nad jednotlivými bity, nikoli nad skupinami bitů. Na tomto místě je možná dobré upozornit na instrukci PANDN (not-and), která sice není ve většině běžných (skalárních) aritmeticko-logických jednotkách implementována, ovšem v případě zpracování rastrových obrazů se jedná o velmi užitečnou instrukci používanou například při vykreslování spritů atd.
Obrázek 8: Pokud je pro přičtení offsetu použita operace součtu se zanedbáním přenosu (carry), tj. když se počítá systémem „modulo N“ (viz též výše zmíněná instrukce PADDB), dochází při překročení maximální hodnoty pixelu (čistě bílá barva) k viditelným chybám.
5. Registry používané jednotkou MMX
Inženýři ve firmě Intel stáli při návrhu instrukční sady MMX před požadavkem na vytvoření výkonných instrukcí provádějících SIMD operace, na druhou stranu však bylo nutné šetřit počtem tranzistorů a tím pádem i plochou čipu, na němž byl mikroprocesor vytvořen. Pravděpodobně právě z tohoto důvodu se rozhodli učinit poněkud problematický krok – navrhli MMX instrukce takovým způsobem, aby mohly pracovat s osmicí 64bitových registrů rozdělených na jeden, dva, čtyři či osm prvků. Ovšem nejednalo se o nové registry rozšiřující původní sadu registrů procesoru Pentium, ale o část registrů využívaných matematickým koprocesorem (FPU). Ten na platformě x86 prováděl operace s osmicí 80bitových registrů uspořádaných do zásobníku (u matematického koprocesoru Intel 8087 byly používány čistě zásobníkové instrukce, později byly přidány i další adresovací režimy, které umožňovaly registry adresovat přímo, což se ukázalo být výhodnější především kvůli možnostem provádění různých optimalizací).
Obrázek 9: Při použití operace součtu se saturací sice taktéž dojde ke ztrátě informace (vzniknou oblasti s pixely majícími hodnotu 255), ovšem viditelná chyba je mnohem menší, než na předchozím obrázku. Tento filtr by bylo možné realizovat s využitím instrukce PADDUSB s rychlostí výpočtu 8 pixelů/instrukci.
V případě instrukcí MMX se sice registry adresovaly přímo (popř. se adresovala slova uložená v operační paměti, která mohla tvořit jeden z operandů), ale kvůli tomu, že jak FPU, tak i jednotka MMX pracovala se shodnými registry (horních 16 bitů nebylo využito), bylo současné používání SIMD operací a operací s hodnotami uloženými v systému plovoucí řádové čárky poměrně komplikované, což je škoda, protože právě souběžná práce superskalárního CPU (u mikroprocesorů Pentium byly vytvořeny dvě instrukční pipeline „u“ a „v“), jednotky MMX a navíc ještě matematického koprocesoru by v mnoha případech mohla vést k citelnému nárůstu výpočetního výkonu. V následující tabulce jsou vypsána jména registrů tak, jak jsou použita v instrukcích matematického koprocesoru, i ve formě používané jednotkou MMX:
Registr FPU | bity 79–64 | bity 63–0 |
---|---|---|
ST0 | nepoužito | MM0 |
ST1 | nepoužito | MM1 |
ST2 | nepoužito | MM2 |
ST3 | nepoužito | MM3 |
ST4 | nepoužito | MM4 |
ST5 | nepoužito | MM5 |
ST6 | nepoužito | MM6 |
ST7 | nepoužito | MM7 |
Obrázek 10: Typy vektorů, s nimiž pracují instrukce MMX.
6. Instrukční sada 3DNow! aneb odpověď firmy AMD na instrukční sadu MMX
Rozšíření instrukční sady procesorů z rodiny x86 o instrukce MMX bylo poměrně razantní – jednalo se v podstatě o největší změnu této architektury od vzniku procesoru 80386, tj. od zavedení virtuálního režimu, 32bitových registrů a operací s 32 bitovými hodnotami. Z hlediska společnosti Intel se samozřejmě jednalo o nemalou konkurenční výhodu získanou nad firmami AMD, Cyrix či IDT, zejména poté, co se podpora MMX operací zařadila do některých programových produktů (například do zásuvných modulů Photoshopu). Ovšem tehdejší druhý největší výrobce čipů x86 – společnost AMD – o necelé dva roky později představila vlastní rozšíření instrukční sady, které bylo označeno poměrně nabubřelým názvem 3DNow! (včetně onoho vykřičníku na konci). Toto rozšíření instrukční sady bylo poprvé implementováno v mikroprocesoru AMD K6–2 a později též v AMD K6–3 a Athlon.
Obrázek 11: Mikroprocesor AMD K6–2 implementující mj. i instrukční sadu 3DNow!
Inženýři z firmy AMD použili a současně i rozšířili instrukční sadu MMX o několik nových celočíselných instrukcí, ovšem hlavní konkurenční výhodou (a to poměrně podstatnou) byly nové instrukce pro práci s čísly reprezentovanými 32bitovými hodnotami s plovoucí řádovou čárkou. Kromě toho bylo do instrukční sady 3DNow! přidáno několik operací sloužících pro přečtení bloku dat do vyrovnávací paměti (cache). U některých typů procesorů (Athlon) bylo navíc možné určit, zda je blok dat načtených do vyrovnávací paměti určený pro čtení nebo i pro zápis (pokud se jednalo o blok určený pro zápis, byl mu nastaven atribut modified).
Obrázek 12: Další pohled na mikroprocesor AMD K6–2 s implementací instrukční sady 3DNow!.
7. Datové typy instrukcí 3DNow!
Již v předchozí kapitole jsme se zmínili o tom, že instrukční sada 3DNow! byla vlastně rozšířením instrukční sady MMX. To mj. znamená, že byly podporovány všechny datové typy MMX, tj. osmiprvkové vektory s osmibitovými hodnotami, čtyřprvkové vektory s 16bitovými hodnotami, dvouprvkové vektory s 32bitovými hodnotami a konečně i 64bitové skalární hodnoty. Navíc však bylo možné do 64bitových registrů MMX uložit dvojici 32bitových čísel s plovoucí řádovou čárkou odpovídající formátu single precision definovaném v normě IEEE 754. Zavedení tohoto nového typu dvouprvkového vektoru s sebou přinášelo dvě výhody: mnohé FP operace se mohly provádět paralelně (součet prvků vektorů atd.) a navíc bylo velmi snadné kombinovat původní celočíselné MMX operace s operacemi nad reálnými čísly. To nebylo u původní implementace MMX snadné, protože se muselo provádět přepínání mezi činností matematického koprocesoru a jednotkou MMX.
Obrázek 13: Mikroprocesor Intel Atom sice implementuje instrukční sadu MMX, ale nikoli 3Dnow!, což je ovšem kompenzováno podporou SSE a SSE2.
V případě instrukční sady 3DNow! se toto přepínání provádět nemuselo (pokud tedy nebylo nutné pracovat s hodnotami s dvojitou či rozšířenou přesností, tj. s datovými typy double a extended), navíc měli programátoři k dispozici konverzní instrukce PI2FD a PF2ID pro převod celočíselných 32bitových hodnot na hodnoty s plovoucí řádovou čárkou (se zaokrouhlením) a naopak. Mimochodem: pro přepnutí kontextu mezi FPU operacemi a MMX/3DNow! operacemi bylo možné použít instrukci FEMMS pro rychlé přepnutí kontextu. Tato operace je rychlejší, než původní instrukce EMMS ze sady MMX, ovšem po přepnutí je obsah pracovních registrů nedefinovaný (což většinou nevadí).
Obrázek 14: Uložení dvou 32bitových čísel s plovoucí řádovou čárkou v 64bitovém registru.
(Zdroj: 3Dnow! Technology Manual, AMD Inc.)
8. Vektorové instrukce 3DNow!
Všechny vektorové instrukce provádějící operace s 32bitovými numerickými hodnotami s plovoucí řádovou čárkou, které jsou implementovány v instrukční sadě 3DNow!, jsou vypsány v následující tabulce:
# | Instrukce | Popis |
---|---|---|
1 | PI2FD | převod 32bitových celočíselných hodnot na FP hodnoty |
2 | PF2ID | převod 32bitových FP hodnot na celočíselné hodnoty |
3 | PFCMPGE | porovnání na relaci „větší nebo rovno“ |
4 | PFCMPGT | porovnání na relaci „větší než“ |
5 | PFCMPEQ | porovnání na relaci „rovnost“ |
6 | PFACC | součet obou prvků zdrojového registru i obou prvků cílového registru |
7 | PFADD | součet dvou dvouprvkových vektorů |
8 | PFSUB | rozdíl dvou dvouprvkových vektorů |
9 | PFSUBR | rozdíl dvou dvouprvkových vektorů s prohozením operandů |
10 | PFMIN | výpočet minima (vždy mezi příslušnými prvky vektorů) |
11 | PFMAX | výpočet maxima (vždy mezi příslušnými prvky vektorů) |
12 | PFMUL | součin dvou dvouprvkových vektorů |
13 | PFRCP | výpočet aproximace převrácené hodnoty |
14 | PFRSQRT | výpočet aproximace druhé odmocniny |
15 | PFRCPIT1 | první krok přesného výpočtu převrácené hodnoty |
16 | PFRSQIT1 | první krok přesného výpočtu druhé odmocniny |
17 | PFRCPIT2 | další krok výpočtu převrácené hodnoty či druhé odmocniny |
Obrázek 15: Formát 32bitových čísel s plovoucí řádovou čárkou podporovaný instrukcemi 3Dnow!)
(Zdroj: 3Dnow! Technology Manual, AMD Inc.)
Při provádění porovnání prvků dvou vektorů, tj. při provádění instrukcí PFCMPGE, PFCMPGT a PFCMPEQ, je výsledkem této operace nový dvouprvkový vektor obsahující pouze hodnoty 0×0000_0000 a 0×FFFF_FFFF. U porovnávání se navíc nerozlišuje kladná a záporná nula.
Pravděpodobně nejzajímavější je poslední pětice instrukcí PFRCP, PFRSQRT, PFRCPIT1, PFRSQIT1 a PFRCPIT2. Instrukce PFRCP slouží k rychlému výpočtu převrácené hodnoty, ovšem pouze s přesností na 14 bitů. Pokud tato přesnost není dostatečná (pro mnoho účelů však stačí), musí být použita následující sekvence:
PFRCP ; první přiblížení k výsledku s přesností 14 bitů PFCPIT1 ; první krok přesného výpočtu převrácené hodnoty PFRCPIT2 ; druhý krok přesného výpočtu převrácené hodnoty
Důležité je, že první přiblížení se k výsledku je provedeno velmi rychle, konkrétně pouze ve dvou taktech, protože se využívá tabulky výsledků umístěné v paměti ROM. Teprve další dvojice instrukcí využívá pomalejší iterační výpočet. Podobný princip platí i pro rychlý vs. přesný výpočet druhé odmocniny.
Obrázek 16: Subrutina pro operaci dělení s 24 bitovou přesností implementovanou pomocí instrukcí 3Dnow!.
(Zdroj: 3Dnow! Technology Manual, AMD Inc.)
9. Odkazy na Internetu
- 3Dnow! Technology Manual
AMD Inc., 2000 - Intel MMXTM Technology Overview
Intel corporation, 1996 - MultiMedia eXtensions
http://softpixel.com/~cwright/programming/simd/mmx.phpi - Great Microprocessors of the Past and Present: Motorola 88000, Late but elegant (mid 1988) . . . .
http://www.unixhub.com/docs/misc/cpu.html#88000 - badabada.org (rozcestník s informacemi čipech Motorola 88000)
http://badabada.org/index.html - Motorola 88000 (Wikipedia)
http://en.wikipedia.org/wiki/Motorola_88000 - Motorola MC88100 (Wikipedia)
http://en.wikipedia.org/wiki/MC88100 - Motorola MC88110 (Wikipedia)
http://en.wikipedia.org/wiki/MC88110 - 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 - Sixth Generation Processors
http://www.pcguide.com/ref/cpu/fam/g6.htm - Great Microprocessors of the Past and Present
http://www.cpushack.com/CPU/cpu1.html - Philip Koopman: Stack Computers: the new wave
http://www.ece.cmu.edu/~koopman/stack_computers/contents.html - Hewlett Packard PA-8800 RISC (LOSTCIRCUITS)
http://www.lostcircuits.com/mambo//index.php?option=com_content&task=view&id=42&Itemid=42 - PA-RISC 1.1 Architecture and Instruction Set Reference Manual
http://h21007.www2.hp.com/portal/download/files/unprot/parisc/pa1–1/acd.pdf - PA-RISC (Wikipedia)
http://en.wikipedia.org/wiki/PA-RISC - The Great CPU List: Part VI: Hewlett-Packard PA-RISC, a conservative RISC (Oct 1986)
http://jbayko.sasktelwebsite.net/cpu4.html - HP 9000/500 FOCUS
http://www.openpa.net/systems/hp-9000_520.html - HP FOCUS Microprocessor (Wikipedia)
http://en.wikipedia.org/wiki/HP_FOCUS - HP 3000 (Wikipedia)
http://en.wikipedia.org/wiki/HP_3000 - The SPARC Architecture Manual Version 8 (manuál v PDF formátu)
http://www.sparc.org/standards/V8.pdf - The SPARC Architecture Manual Version 9 (manuál v PDF formátu)
http://developers.sun.com/solaris/articles/sparcv9.pdf - SPARC Pipelining
http://www.academic.marist.edu/~jzbv/architecture/Projects/S2002/SPARC/pipelining.html - SPARC Instruction
http://www.academic.marist.edu/~jzbv/architecture/Projects/S2002/SPARC/inst_set.html - SPARC Instruction Set
http://www.academic.marist.edu/~jzbv/architecture/Projects/S2002/SPARC/inst_set.html - MIPS Architecture Overview
http://tams-www.informatik.uni-hamburg.de/applets/hades/webdemos/mips.html - MIPS Technologies R3000
http://www.cpu-world.com/CPUs/R3000/ - The MIPS Register Usage Conventions
http://pages.cs.wisc.edu/~cs354–2/beyond354/conventions.html - 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 - 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 - 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 - Maurice V. Wilkes Home Page
http://www.cl.cam.ac.uk/archive/mvw1/ - Papers by M. V. Wilkes (důležitá je především jeho práce číslo 35)
http://www.cl.cam.ac.uk/archive/mvw1/list-of-papers.txt - Microprogram Memory
http://free-books-online.org/computers/advanced-computer-architecture/microprogram-memory/ - First Draft of a report on the EDVAC
http://qss.stanford.edu/~godfrey/vonNeumann/vnedvac.pdf - Introduction to Microcontrollers
http://www.pic24micro.com/cisc_vs_risc.html - 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 - SPARC Tagged Data – otázka
http://compilers.iecc.com/comparch/article/91–04–079 - SPARC Tagged Data – odpověď #1
http://compilers.iecc.com/comparch/article/91–04–082 - SPARC Tagged Data – odpověď #2
http://compilers.iecc.com/comparch/article/91–04–088 - CPU design (Wikipedia)
http://en.wikipedia.org/wiki/CPU_design - Control unit (Wikipedia)
http://en.wikipedia.org/wiki/Control_unit - Microcode (Wikipedia)
http://en.wikipedia.org/wiki/Microcode - Microsequencer (Wikipedia)
http://en.wikipedia.org/wiki/Microsequencer - Maurice Wilkes (Wikipedia)
http://en.wikipedia.org/wiki/Maurice_Wilkes - Micro-operation (Wikipedia)
http://en.wikipedia.org/wiki/Micro-operation - b16 stack processor
http://www.jwdt.com/~paysan/b16.html - Color Forth (Chuck Moore home page)
http://www.colorforth.com/ - colorForth Instructions
http://www.colorforth.com/inst.htm - SEAforth 40C18
http://www.intellasys.net/index.php?option=com_content&task=view&id=60&Itemid=75 - Bit slicing
http://en.wikipedia.org/wiki/Bit_slicing - Bitslice DES
http://www.darkside.com.au/bitslice/ - Great Microprocessors of the Past and Present: Part VII: Advanced Micro Devices Am2901, a few bits at a time …
http://www.cpushack.com/CPU/cpu1.html#Sec1Part7 - Cray History
http://www.cray.com/About/History.aspx?404;http://www.cray.com:80/about_cray/history.html - Cray Historical Timeline
http://www.cray.com/Assets/PDF/about/CrayTimeline.pdf - Seymour Cray Biography
http://www.cray.com/Assets/PDF/about/SeymourCray.pdf - Company: Cray Research, Inc. (Computer History)
http://www.computerhistory.org/brochures/companies.php?alpha=a-c&company=com-42b9d5d68b216 - Cray Wiki
http://www.craywiki.com/index.php?title=Main_Page - Seymour Cray
http://www.craywiki.com/index.php?title=Seymour_Cray - Cray (Wikipedia)
http://en.wikipedia.org/wiki/Cray - Cray-1 (Cray Wiki)
http://www.craywiki.com/index.php?title=Cray_1S - Cray-1 (Wikipedia)
http://en.wikipedia.org/wiki/Cray-1 - Cray X-MP (Wikipedia)
http://en.wikipedia.org/wiki/Cray_X-MP - Cray-2 (Wikipedia)
http://en.wikipedia.org/wiki/Cray-2 - What Limits Forecast Accuracy?
http://weather.mailasail.com/Franks-Weather/Forecast-Accuracy-Limitations - Remembering the Cray-1
http://www.theregister.co.uk/2008/01/05/tob_cray1/ - Cray Supercomputer FAQ and other documents
http://www.spikynorman.dsl.pipex.com/CrayWWWStuff/index.html - Cray Research and Cray computers FAQ Part 1
http://www.spikynorman.dsl.pipex.com/CrayWWWStuff/Cfaqp1.html#TOC - Cray Research and Cray computers FAQ Part 2
http://www.spikynorman.dsl.pipex.com/CrayWWWStuff/Cfaqp2.html#TOC1 - Cray Research and Cray computers FAQ Part 3
http://www.spikynorman.dsl.pipex.com/CrayWWWStuff/Cfaqp3.html#TOC1 - Cray Research and Cray computers FAQ Part 4
http://www.spikynorman.dsl.pipex.com/CrayWWWStuff/Cfaqp4.html#TOC1 - Cray Research and Cray computers FAQ Part 5
http://www.spikynorman.dsl.pipex.com/CrayWWWStuff/Cfaqp5.html#TOC1 - The making of a CRAY-3
http://www.cisl.ucar.edu/docs/SCD_Newsletter/News_summer93/04e.cray3.html - Computer Speed Claims 1980 to 1996
http://homepage.virgin.net/roy.longbottom/mips.htm