Obsah
1. Mikroprocesory ARM a architektura VFP (Vector Floating Point)
2. Pracovní registry a formát zpracovávaných hodnot
3. Řídicí a stavový registr FPSCR
4. Skalární a vektorový režim FP instrukcí
5. Rozdělení registrů do bank, nastavení parametrů STRIDE a LEN
6. Instrukční sada VFP: vektorové aritmetické operace
7. Porovnání dvou hodnot, porovnání s nulou
8. Přesuny dat, načtení konstanty a konverzní instrukce
1. Mikroprocesory ARM a architektura VFP (Vector Floating Point)
V předchozí části seriálu o architekturách počítačů jsme se seznámili s technologií nazvanou FPA neboli Floating Point Architecture. Jednalo se o jednu z několika dostupných technologií, která umožňovala na mikroprocesorech s architekturou ARM zpracovávat numerické hodnoty uložené ve formátu plovoucí řádové čárky (FP – floating point). Propojení mezi jádrem procesorů ARM a matematickým koprocesorem FPA bylo realizováno přes standardizované rozhraní umožňující kooperaci s různými typy koprocesorů, ať již se jedná o zde popisované matematické koprocesory, tak i například o I/O procesory (řadiče USB…), grafické moduly atd. Připomeňme si, že matematické koprocesory FPA dokázaly pracovat s čísly odpovídajícími v normě IEEE 754 formátům s jednoduchou přesností (single/float, šířka 32 bitů), s dvojitou přesností (double, šířka 64 bitů) a taktéž s rozšířenou přesností (extended, šířka 80 bitů).
Ovšem již minule jsme se zmínili o tom, že technologie FPA není jedinou „floating point“ technologií, kterou je možné na procesorech ARM využít. Alternativní a dnes dokonce častěji používanou technologií je VFP, což je zkratka odvozená od Vector Floating Point (jedná se o označení, jež je v současnosti možná již poněkud zavádějící). 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, o níž se v tomto seriálu ještě určitě zmíníme.
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ámka: zatímco matematické koprocesory FPA byly vytvářeny většinou na samostatném čipu, jsou jádra VFP přímo součástí stejných čipů, na nichž je implementováno samotné jádro ARM.
2. Pracovní registry a formát zpracovávaných hodnot
Na rozdíl od matematických koprocesorů FPA podporujících formáty single (32bit), double (64bit) i extended (80bit) se u technologie VFP používají především formáty single/float a double, přičemž existují rozšíření i pro formáty s poloviční přesností (half-float), které lze v některých oblastech s výhodou používat, například pro ukládání barvových složek pixelů (zvýší se tím mj. i dynamický rozsah při filtraci obrazu). Vzhledem k tomu, že technologie VFP je určena i pro aplikaci v systémech, v nichž je mnohdy důležité dosáhnout co největšího výpočetního výkonu popř. co nejkratší doby odezvy (RT aplikace), může matematický koprocesor VFP pracovat buď v režimu full compliance, který je přímo kompatibilní s normou IEEE 754, popř. je možné povést přepnutí do režimu RunFast, v němž se negenerují některé výjimky a taktéž může dojít ke ztrátě přesnosti v nejnižších bitech mantisy (většinou pouze v bitu nejnižším). Vlastnosti obou režimů jsou samozřejmě velmi přesně popsány, takže záleží jen na vývojáři, který režim v daný okamžik použije.
Matematické koprocesory VFP obecně obsahují šestnáct pracovních registrů, každý o šířce 64 bitů. Tyto registry lze použít buď pro práci s hodnotami s dvojitou přesností (double) – potom se tyto registry v assembleru označují jmény d0 až d15. Ovšem taktéž je možné libovolný registr rozdělit na dva registry o šířce 32 bitů, z nichž každý dokáže pojmout číselnou hodnotu s jednoduchou přesností (single/float). Díky tomuto rozdělení se počet registrů pro formát single zvětšil na dvojnásobek – tyto registry jsou v assembleru pojmenovány s0 až s31. Podle konvence dodržované jak překladači, tak i v programových knihovnách se při volání subrutin používají registry d0 až d7 pro předávání parametrů subrutině, popř. pro získání návratových hodnot ze subrutiny. Samozřejmě se tyto registry taktéž používají při výpočtech v subrutině. Ostatní registry lze taktéž použít, ovšem jejich hodnota by měla být při návratu ze subrutiny obnovena.
Poznámka: v předchozí kapitole jsme se zmínili o třetí verzi technologie VFP označované VFPv3. Ve skutečnosti tato verze existuje ve dvou variantách, přičemž první varianta je nazvaná VFPv3-D16 a druhá varianta se označuje VFPv3-D32. U první varianty platí všechny informace uvedené v předchozích dvou odstavcích (16 registrů typu double rozdělitelných na 32 registrů typu single), ale u varianty VFPv3-D32 se počet registrů typu double zdvojnásobil, čehož lze samozřejmě s výhodou využít v mnoha typech aplikací (ovšem zaplatíme za to větším počtem tranzistorů a tím pádem i větší plochou čipu i jeho spotřebou).
3. Řídicí a stavový registr FPSCR
Při popisu technologie FPA jsme se zmínili i o dvou důležitých řídicích a stavových registrech. Jednalo se o registr FPSR (Floating Point Status Register) a FPCR (Floating Point Control Register). Oba tyto registry mají šířku 32 bitů, což umožňuje snadné přenesení jejich obsahu do vybraného pracovního registru procesoru ARM. Podobný typ registru existuje taktéž u technologie VFP – jedná se o registr FPSCR neboli Floating Point Status and Control Register. I tento registr má šířku 32 bitů a lze ho přenášet do a z vybraného pracovního registru mikroprocesoru ARM. Ve skutečnosti je tento přenos dokonce nutný například v těch případech, kdy je zapotřebí nastavit pouze vybranou oblast v tomto registru. Může se například jednat o bitová pole STRIDE a LEN, které mají velký význam pro provádění vektorových operací, neboť určují, s jak dlouhými vektory a s jakým uspořádáním prvků vektoru se bude pracovat.
Při změně hodnoty pouze některých bitů registru FPSCR se používá následující sekvence instrukcí:
VMRS r3,FPSCR ; přesun hodnoty FPSCR do registru R3 BIC r3,r3,#0x00370000 ; vynulování bitových polí STRIDE a LEN ORR r3,r3,#0x00030000 ; nastavení STRIDE = 1 a LEN = 4 VMSR FPSCR,r3 ; zpětný přesun hodnoty z R3 do registru FPSCR
Jaké informace však vlastně registr FPSCR obsahuje? Jeho obsah se liší v závislosti na tom, o jakou variantu technologie VFP se jedná, ale obecně lze říci, že zde můžeme najít minimálně pět bitových polí: příznaky nastavované po aritmetických a porovnávacích operacích, výběr zaokrouhlovacího režimu, příznaky nastavované při některém typu výjimky (ztráta přesnosti, neplatná operace…), bity, s jejichž pomocí lze blokovat tyto výjimky a konečně bitová pole STRIDE a LEN používaná pro nastavování způsobu provádění vektorových operací.
Pro nastavení zaokrouhlovacího režimu postačuje dvojice bitů:
Kód | Režim | Význam |
---|---|---|
00 | RN | nejbližší reprezentovatelná hodnota |
01 | RP | zaokrouhlení směrem ke kladnému nekonečnu |
10 | RM | zaokrouhlení směrem k zápornému nekonečnu |
11 | RZ | zaokrouhlení směrem k nule |
Příznakové bity nastavované po aritmetických a porovnávacích operacích jsou čtyři, jak lze očekávat. Tyto příznakové bity se většinou kopírují do CPSR, aby se mohly využít v podmíněných skocích (všechny instrukční sady) nebo v podmínkových bitech (instrukční sada ARM):
Příznak | Význam |
---|---|
N | výsledek záporný, menší než |
Z | výsledek nulový, rovnost |
C | větší než |
V | hodnoty nelze vzájemně uspořádat |
Dalších pět bitů je nastavovaných při výskytu nějaké výjimky v průběhu provádění FP operací:
Bit | Význam |
---|---|
IXC | ztráta přesnosti |
UFC | podtečení |
OFC | přetečení |
DZC | dělení nulou |
IOC | neplatná operace 0/0, log -n apod. |
Výše vypsané výjimky lze blokovat posledními pěti bity:
Bit | Význam |
---|---|
IXE | blokace/povolení příznaku IXC |
UFE | blokace/povolení příznaku UFC |
OFE | blokace/povolení příznaku OFC |
DZE | blokace/povolení příznaku DZC |
IOE | blokace/povolení příznaku IOC |
4. Skalární a vektorový režim FP instrukcí
Při vzniku technologie VFP se její tvůrci zaměřili na to, aby instrukční sada VFP umožňovala jak práci se skalárními hodnotami, tak i práci s vektory. Na první pohled by se tedy mohlo zdát, že se jedná o jednu z mnoha aplikací architektury SIMD, ve skutečnosti se ovšem v případě VFP vektory zpracovávají sekvenčně. To například znamená, že součet dvou osmiprvkových vektorů realizovaný instrukcí VADD používá tu samou FP-sčítačku a prvky vektorů jsou tedy sečítány postupně. Stále se jedná o rychlejší operaci, než osm krát opakovaná instrukce ADF (mimo jiné se ušetří cykly strávené při načítání a dekódování instrukce – instruction fetch a instruction decode) – ovšem reálný SIMD systém to není, na rozdíl od na první pohled obdobných technologií: 3DNow!, SSE atd. Změna přišla až při sloučení VFP s technologií NEON, která na procesory ARM přinesla skutečné operace SIMD.
5. Rozdělení registrů do bank, nastavení parametrů STRIDE a LEN
Při provádění vektorových operací se pracovní registry rozdělují do takzvaných bank. V případě použití formátu single jsou použity čtyři banky, z nichž každá obsahuje osm pracovních registrů: s0-s7, s8-s15, s16-s23, s24-s31. Pokud je použit formát double, existují banky čtyři a každá z nich obsahuje čtyři registry: d0-d3, d4-d7, d8-d11, d12-d15. U architektury VFPv3-D32, která nabízí dvojnásobný počet registrů typu double, se počet bank s registry typu double taktéž rozšiřuje na osm. Význam bank je následující: vektorovou operaci lze totiž provést s dvojicí vektorů, přičemž každý vektor je sestaven maximálně z osmi registrů typu single, popř. ze čtyř registrů typu double, které ovšem musí ležet v jedné bance. Navíc platí, že pokud je v instrukci zvolen vyšší registr v bance a délka vektoru přesahuje počet zbylých registrů v této bance, bude se při indexaci prvků vektorů „wrapovat“ na začátek banky:
Délka vektoru = 6 První registr s5 (bank s0-s7) Vektor použitý v instrukci: [s5, s6, s7, s0, s1, s2]
Toto chování sice může na první pohled vypadat dosti neobvykle, ovšem v praxi ho lze s výhodou použít u některých algoritmů vyžadujících jiné uspořádání prvků vektoru.
Již ve čtvrté kapitole jsme se zmínili o tom, že ve stavovém a řídicím registru FPSCR se mj. nachází i bitová pole LEN a STRIDE. Bitové pole LEN má šířku tři bity a obsahuje délku zpracovávaných vektorů, od níž je odečtena jednička. Pro skalární operace tedy postačuje nastavit všechny tři bity LEN na nulu, což značí délku vektoru jeden prvek. Bitové pole STRIDE (o šířce 2 bity) je zajímavější – touto hodnotou lze totiž zvolit, zda registry ve vektoru budou uloženy v po sobě jdoucích registrech, či zda budou uloženy ob jeden, dva či tři FP registry. Opět si to ukažme na příkladu:
LEN=3 STRIDE=1 start=s1 odpovídá vektoru {s1, s2, s3} LEN=3 STRIDE=2 start=s1 odpovídá vektoru {s1, s3, s5} LEN=4 STRIDE=1 start=s6 odpovídá vektoru {s6, s7, s0, s1} LEN=4 STRIDE=2 start=s6 odpovídá vektoru {s6, s0, s2, s4}
Použití STRIDE=2 má samozřejmě svůj význam, neboť po sobě jdoucí registry mohou obsahovat sekvenci souřadnic [x,y] a v některém okamžiku pouze potřebujeme pracovat se všemi souřadnicemi x atd.
6. Instrukční sada VFP: vektorové aritmetické operace
Nyní se již konečně dostáváme k popisu jednotlivých instrukcí, které lze nalézt v instrukční sadě VFP. Zajímavý je především fakt, že každá instrukce obsahuje příznak, zda se má provádět operace s hodnotami/registry typu single či double. Instrukce taktéž obsahují příznakové bity určující, za jakých podmínek se instrukce má provést. Význam těchto příznakových bitů je poněkud odlišný od bitů použitých v instrukční sadě ARM, a to především z toho důvodu, že příznak V má odlišný význam (přetečení hodnoty celého čísla do znaménkového bitu versus dvě FP hodnoty nelze porovnat). To, zda se bude vybraná operace provádět nad dvojicí skalárních hodnot nebo nad dvojicí registrů, je určeno hodnotami LEN (a vlastně též STRIDE), o nichž jsme se zmiňovali v předchozích kapitolách.
V následující tabulce jsou vypsány základní aritmetické operace:
# | Instrukce | Význam | Prováděný výpočet |
---|---|---|---|
1 | VADD Fd, Fn, Fm | součet | Fd := Fn + Fm |
2 | VSUB Fd, Fn, Fm | rozdíl | Fd := Fn – Fm |
3 | VNEG Fd, Fm | změna znaménka | Fd := – Fm |
4 | VABS Fd, Fm | absolutní hodnota | Fd := abs(Fm) |
5 | VSQRT Fd, Fm | druhá odmocnina | Fd := sqrt(Fm) |
6 | VDIV Fd, Fn, Fm | dělení | Fd := Fn / Fm |
7 | VMUL Fd, Fn, Fm | násobení | Fd := Fn * Fm |
8 | VMLA Fd, Fn, Fm | násobení + akumulace | Fd := Fd + (Fn * Fm) |
9 | VMLS Fd, Fn, Fm | odečtení součinu | Fd := Fd – (Fn * Fm) |
10 | VNMUL Fd, Fn, Fm | násobení + změna znaménka | Fn := – (Fn * Fm) |
11 | VNMLA Fd, Fn, Fm | kombinace VNMUL a VMLA | Fd := – Fd – (Fn * Fm) |
12 | VNMLS Fd, Fn, Fm | kombinace VNMUL a VMLS | Fd := – Fd + (Fn * Fm) |
Poznámka: povšimněte si především šesti různých variant násobení. To je zapříčiněno tím, že se VFP používá například i pro filtraci obrazu, FFT atd., kde lze tyto operace s výhodou použít.
7. Porovnání dvou hodnot, porovnání s nulou
Mezi další důležité operace prováděné matematickými koprocesory s technologií VFP patří instrukce pro porovnání dvou hodnot (samozřejmě uložených ve dvojici registrů), popř. porovnání hodnoty jednoho registru s nulou. Porovnání je provedeno instrukcí VCMP, u níž lze navíc pomocí prefixu „P“ určit, ve kterých případech se má vyvolat výjimka. Porovnání nastaví všechny čtyři příznakové bity C, Z, N a V. Pro přesun příznakových bitů z registru FPSCR do registru CSR je nutné použít instrukci VMRS APSR_nzcv, FPSCR:
# | Instrukce | Význam | Prováděný výpočet |
---|---|---|---|
1 | VCMP Fd, Fm | Porovnání obsahu dvou registrů | Fd – Fm |
2 | VCMP Fd, #0.0 | Porovnání jednoho registru s nulou | Fd – 0.0 |
8. Přesuny dat, načtení konstanty a konverzní instrukce
V poslední tabulce jsou vypsány instrukce provádějící různé přesuny dat s případnými konverzemi dat. Operace s hodnotami s poloviční přesností (half) jsou dostupné pouze na koprocesorech s architekturou VFPv3:
# | Instrukce | Význam |
---|---|---|
1 | VCVT{C}.F64.F32 Dd, Sm | Konverze single na double |
2 | VCVT{C}.F32.F64 Sd, Dm | Konverze double na single |
3 | VCVT{C}.F32/F64.U32 Fd, Sm | Konverze unsigned integer na float |
4 | VCVT{C}.F32/F64.S32 Fd, Sm | Konverze signed integer na float |
5 | VCVT{R}{C}.U32.F32/F64 Sd, Fm | Konverze float na unsigned integer |
6 | VCVT{R}{C}.S32.F32/F64 Sd, Fm | Konverze float na signed integer |
7 | VCVT.F32/F64.typ Fd, Fd, #bitů | Konverze fixed-point na float (volitelná pozice tečky) |
8 | VCVT.typ.F32/F64 Fd, Fd, #bitů | Konverze float na fixed-point (volitelná pozice tečky) |
9 | VCVTT.F16.F32 Sd,Sm | Konverze single na half (do horních 16 bitů registru) |
10 | VCVTB.F16.F32 Sd,Sm | Konverze single na half (do spodních 16 bitů registru) |
11 | VCVTT.F32.F16 Sd,Sm | Konverze half na single |
12 | VCVTB.F32.F16 Sd,Sm | Konverze half na single |
13 | VMOV.F32/F64 Fd, Fm | Fd := Fm (prostá kopie) |
14 | VMOV Sn, Rd | Sn := Rd (Rd = registr ARM procesoru) |
15 | VMOV Rd, Sn | Rd := Sn (Rd = registr ARM procesoru) |
16 | VMOV Sn, Sm, Rd, Rn | Sn := Rd, Sm := Rn (kopie dvou registrů) |
17 | VMOV Rd, Rn, Sn, Sm | Rd := Sn, Rn := Sm (kopie dvou registrů) |
18 | VMOV Dm, Rd, Rn | Dm[31:0] := Rd, Dm[63:32] := Rn (pro double jsou zapotřebí dva ARM registry) |
19 | VMOV Rd, Rn, Dm | Rd := Dm[31:0], Rn := Dm[63:32] (pro double jsou zapotřebí dva ARM registry) |
20 | VMOV Dn[0], Rd | Dn[31:0] := Rd (pouze spodní polovina double) |
21 | VMOV Rd, Dn[0] | Rd := Dn[31:0] (pouze spodní polovina double) |
22 | VMOV Dn[1], Rd | Dn[63:32] := Rd (pouze horní polovina double) |
23 | VMOV Rd, Dn[1] | Rd := Dn[63:32] (pouze horní polovina double) |
24 | VMRS APSR_nzcv, FPSCR | APSR flags := FPSCR flags (přenos příznaků) |
9. Odkazy na Internetu
- The VFP architecture
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0056d/Bcfibfha.html - NEON
http://www.arm.com/products/processors/technologies/neon.php - ARM Floating Point Accelerator (ARM FPA)
http://vswww.kaist.ac.kr/ver4.0/index.php/research/past-research/arm-fpa.html - Coding for NEON – Part 1: Load and Stores
http://blogs.arm.com/software-enablement/161-coding-for-neon-part-1-load-and-stores/ - Coding for NEON – Part 2: Dealing With Leftovers
http://blogs.arm.com/software-enablement/196-coding-for-neon-part-2-dealing-with-leftovers/ - Coding for NEON – Part 3: Matrix Multiplication
http://blogs.arm.com/software-enablement/241-coding-for-neon-part-3-matrix-multiplication/ - Coding for NEON – Part 4: Shifting Left and Right
http://blogs.arm.com/software-enablement/277-coding-for-neon-part-4-shifting-left-and-right/ - DSP & SIMD
http://www.arm.com/products/processors/technologies/dsp-simd.php - Improving ARM Code Density and Performance
New Thumb Extensions to the ARM Architecture Richard Phelan - The ARM Processor Architecture
http://www.arm.com/products/processors/technologies/instruction-set-architectures.php - Thumb-2 instruction set
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344c/Beiiegaf.html - Introduction to ARM thumb
http://www.eetimes.com/discussion/other/4024632/Introduction-to-ARM-thumb - ARM, Thumb, and ThumbEE instruction sets
http://www.keil.com/support/man/docs/armasm/armasm_CEGBEIJB.htm - An Introduction to ARM Assembly Language
http://dev.emcelettronica.com/introduction-to-arm-assembly-language - Processors – ARM
http://www.arm.com/products/processors/index.php - The ARM Instruction Set
http://simplemachines.it/doc/arm_inst.pdf - ARM Architecture (Wikipedia)
http://en.wikipedia.org/wiki/ARM_architecture - BBC BASIC
http://www.bbcbasic.co.uk/bbcbasic.html - BBC BASIC
http://mdfs.net/Software/BBCBasic/ - BBC BASIC (Z80) for the ZX Spectrum
http://mdfs.net/Software/BBCBasic/Spectrum/ - BBC BASIC (Wikipedia CZ)
http://en.wikipedia.org/wiki/BBC_BASIC - MIPS-3D® ASE
http://www.mips.com/products/architectures/mips-3d-ase/ - An introduction to SPARC's SIMD offerings
http://mikeburrell.wordpress.com/2007/12/14/an-introduction-to-sparcs-simd-offerings/ - MIPS64TM Architecture for Programmers Volume IV-c: The MIPS-3DTM Application-Specific Extension to the MIPS64TM
http://www.weblearn.hs-bremen.de/risse/RST/docs/MIPS/MD00099–2B-MIPS3D64-AFP-01.11.pdf - Visual Instruction Set
http://www.enotes.com/topic/Visual_Instruction_Set - NEON
http://www.arm.com/products/processors/technologies/neon.php - Architecture and Implementation of the ARM Cortex-A8 Microprocessor
http://www.design-reuse.com/articles/11580/architecture-and-implementation-of-the-arm-cortex-a8-microprocessor.html - Multimedia Acceleration eXtensions (Wikipedia)
http://en.wikipedia.org/wiki/Multimedia_Acceleration_eXtensions - AltiVec (Wikipedia)
http://en.wikipedia.org/wiki/AltiVec - Visual Instruction Set (Wikipedia)
http://en.wikipedia.org/wiki/Visual_Instruction_Set - MAJC (Wikipedia)
http://en.wikipedia.org/wiki/MAJC - MDMX (Wikipedia)
http://en.wikipedia.org/wiki/MDMX - MIPS Multiply Unit
http://programmedlessons.org/AssemblyTutorial/Chapter-14/ass14_3.html - Silicon Graphics Introduces Enhanced MIPS Architecture
http://bwrc.eecs.berkeley.edu/CIC/otherpr/enhanced_mips.html - MIPS-3D (Wikipedia)
http://en.wikipedia.org/wiki/MIPS-3D - MIPS Technologies, Inc. announces new MIPS-3D technology to provide silicon-efficient 3D graphics acceleration
http://www.design-reuse.com/news/2057/mips-mips-3d-technology-silicon-efficient-3d-graphics-acceleration.html - MIPS-3D Built-in Function (gcc.gnu.org)
http://gcc.gnu.org/onlinedocs/gcc/MIPS_002d3D-Built_002din-Functions.html - Baha Guclu Dundar:
Intel MMX, SSE, SSE2, SSE3/SSSE3/SSE4 Architectures - SSE (Streaming SIMD Extentions)
http://www.songho.ca/misc/sse/sse.html - Timothy A. Chagnon: SSE and SSE2
http://www.cs.drexel.edu/~tc365/mpi-wht/sse.pdf - Intel corporation: Extending the Worldr's Most Popular Processor Architecture
http://download.intel.com/technology/architecture/new-instructions-paper.pdf - SIMD architectures:
http://arstechnica.com/old/content/2000/03/simd.ars/ - Intel MMXTM Technology Overview
Intel corporation, 1996 - MultiMedia eXtensions
http://softpixel.com/~cwright/programming/simd/mmx.php - 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 - Very long instruction word (Wikipedia)
http://en.wikipedia.org/wiki/Very_long_instruction_word - Tour of the Black Holes of Computing!: Floating Point
http://www.cs.hmc.edu/~geoff/classes/hmc.cs105…/slides/class02_floats.ppt - 3Dnow! Technology Manual
AMD Inc., 2000 - CPU design (Wikipedia)
http://en.wikipedia.org/wiki/CPU_design - Control unit (Wikipedia)
http://en.wikipedia.org/wiki/Control_unit - 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 - Computer Speed Claims 1980 to 1996
http://homepage.virgin.net/roy.longbottom/mips.htm - Superpočítače Cray
http://www.root.cz/clanky/superpocitace-cray/ - Superpočítače Cray (druhá část)
http://www.root.cz/clanky/superpocitace-cray-druha-cast/ - Superpočítače Cray (třetí část)
http://www.root.cz/clanky/superpocitace-cray-treti-cast/ - Superpočítače Cray (čtvrtá část)
http://www.root.cz/clanky/superpocitace-cray-ctvrta-cast/ - Superpočítače Cray (pátá část): architektura Cray X-MP
http://www.root.cz/clanky/superpocitace-cray-pata-cast-architektura-pocitace-cray-x-mp-a-jeho-pouziti-ve-filmovem-prumyslu/