Hlavní navigace

Instrukční sada Thumb-2 u mikroprocesorů ARM

10. 4. 2012
Doba čtení: 17 minut

Sdílet

Dnes si popíšeme další alternativní instrukční sadu, kterou jsou vybaveny novější modely mikroprocesorů ARM. Jedná se o instrukční sadu pojmenovanou Thumb-2, která byla navržena takovým způsobem, aby co nejlépe spojila přednosti původní RISCové 32bitové instrukční sady a 16bitové sady Thumb.

Obsah

1. Instrukční sada Thumb-2 u mikroprocesorů ARM

2. Důvody vedoucí ke vzniku instrukční sady Thumb-2

3. Thumb-2 v porovnání s původní instrukční sadou ARM a sadou Thumb

4. Naplnění registru šestnáctibitovou konstantou, naplnění horní poloviny registru

5. Operace s bitovými poli uloženými v registrech

6. Instrukce pro otočení všech bitů v pracovním registru

7. Instrukce Compare and branch if (non) zero

8. Prefixová instrukce If-Then

9. Odkazy na Internetu

1. Instrukční sada Thumb-2 u mikroprocesorů ARM

V dnešní části seriálu o architekturách počítačů se již pošesté budeme zabývat popisem mikroprocesorů s architekturou ARM. Dnes se zaměříme především na instrukční sadu Thumb-2, kterou je možné považovat za sadu, která se v sobě snaží sdružit jak přednosti původní 32bitové „RISCové“ instrukční sady ARM, tak i přednosti šestnáctibitové instrukční sady Thumb. Nová instrukční sada Thumb-2 díky tomu na jedné straně dosahuje jak velké hustoty kódu (code density), tak i velkého výpočetního výkonu (viz též třetí kapitolu). Zmíněný výpočetní výkon dosahovaný v reálných aplikacích byl u sady Thumb v některých případech menší, protože mnohé operace musely být provedeny pomocí většího množství instrukcí – instrukce Thumb totiž vždy vykonávaly jen jednu operaci, na rozdíl od instrukcí ARM, které obsahovaly jak podmínkové bity, tak i v mnoha případech „podoperaci“ pro bitový posun či rotaci jednoho z operandů vstupujícího do aritmeticko-logické jednotky.

Sami konstruktéři mikroprocesorů ARM se vyjádřili k tomu, z jakého důvodu vlastně instrukční sada Thumb-2 vznikla. Při jejím návrhu měli na mysli čtyři parametry, které se navzájem ovlivňují a vylepšení jednoho z parametrů většinou v důsledku vede ke zhoršení zbývajících třech parametrů. Jedná se o následující parametry:

  1. Cenu vlastního procesoru, která je kromě jiných okolností ovlivněna i jeho složitostí (existence branch prediktorů, spekulativního provádění instrukcí, …), počtem aritmeticko-logických jednotek (obecně zda jde o skalární či superskalární procesor), velikostí potřebných vyrovnávacích pamětí atd.
  2. Dosahovaný výpočetní výkon v reálných aplikacích. V praxi to znamená, že hodnota udávaná v jednotkách MIPS nebo MFLOPS nemusí být vždy směrodatná: je to právě příklad jednodušších instrukcí Thumb v porovnání s obecně výkonnějšími instrukcemi ARM.
  3. Nutný energetický příkon procesoru (závisí na technologii výroby, napájecím napětí, hodinové frekvenci, počtu ALU, velikosti vyrovnávacích paměti atd.).
  4. Cenu za vývoj a optimalizaci aplikací (tu ovlivňuje složitost instrukční sady, nedostatky v instrukční sadě: například nutnost provádění neefektivních skoků, složitost při načítání konstant do pracovních registrů atd.).

2. Důvody vedoucí ke vzniku instrukční sady Thumb-2

Za povšimnutí stojí především skutečnost, že snaha o vylepšení jednoho parametru zmíněného v předchozí kapitole skutečně ve většině případů vede ke zhoršení ostatních parametrů. Například zvýšení výpočetního výkonu pomocí větších vyrovnávacích pamětích ovlivní jak cenu mikroprocesoru, tak i energetický příkon atd. Zajímavý je ale především význam posledního parametru: cena za vývoj a optimalizaci aplikací. Při zavádění instrukční sady Thumb (zde bez dvojky) se totiž předpokládalo, že většina kódu bude překládána právě do této sady, což zmenší počet výpadků vyrovnávacích pamětí pro srovnatelný program (binární kód), a jen přibližně deset procent kritických částí kódu bude napsáno s využitím instrukcí ARM (jedná se tedy o aplikaci známého pravidla 90:10 či 80:20). To sice může na první pohled velmi dobře fungovat, ovšem zjištění, které jsou vlastně ony kritické části kódu, se muselo mnohdy provádět až v pozdních fázích vývoje, což vedlo mj. i k rostoucí ceně za vývoj (i když popravdě řečeno se to týká skutečně oněch částí kódu, s nimiž si někdo dal tu práci a optimalizoval je ručně s využitím výsledků získaných například z profileru).

Navíc není přepínání mezi instrukcemi ARM a Thumb zcela „zadarmo“, což poněkud zmenšuje možnosti neustálého přepínání, takže se hledal způsob, jak stávající stav ještě vylepšit. Výsledkem této snahy je instrukční sada nazvaná Thumb-2. Její vznik byl umožněn postupným vylepšováním technologie výroby integrovaných obvodů (zjednodušeně řečeno tím, že bylo možné na čipu implementovat větší množství tranzistorů bez razantního nárůstu ceny a/nebo spotřeby) a navíc byl „vynucen“ tím, že se stále zvětšoval rozdíl mezi rychlostí mikroprocesorů a dobou přístupu k pamětem DRAM. Cílem tedy byl menší binární kód (instrukce s větší hustotou) a současně stále dobrá výkonnost dosažená tím, že ne všechny instrukce Thumb-2 jsou tak jednoduché či jednoúčelové, jako instrukce Thumb.

Poznámka: na tomto místě je možná vhodné poznamenat, že i instrukční sada Thumb-2 odpovídá charakteru RISCových mikroprocesorů, na nichž je implementována, tj. stále se jedná o instrukční sadu s operacemi prováděnými především nad pracovními registry, pouze s omezenou možností přístupu do paměti přes instrukce typu Load & Store a s jednoduchými adresovacími režimy.

3. Thumb-2 v porovnání s původní instrukční sadou ARM a sadou Thumb

Důvodů pro vznik nové instrukční sady tedy bylo více než dost, takže se podívejme na to, co se jejím tvůrcům podařilo splnit a co nikoli. V následujícím textu budou uvedeny výsledky měření prezentované samotnou společností ARM. V první tabulce je porovnána „hustota“ binárního strojového kódu měřená jeho délkou. Ve všech případech se jednalo o stejný algoritmus, který byl poprvé implementován s využitím instrukční sady ARM, podruhé s pomocí sady Thumb a potřetí byla použita instrukční sada Thumb-2. Za základ je přitom brána délka původního kódu používajícího instrukce ARM (tento kód odpovídá sto procentům, čím menší číslo, tím menší je i výsledný binární program):

Instrukční sada Délka kódu
ARM 100%
Thumb 70%
Thumb-2 74%

Ve druhé tabulce je uveden relativní výpočetní výkon přeloženého binárního programu, přičemž 100% odpovídá nejrychlejší implementaci a 75% implementaci nejpomalejší:

Instrukční sada Relativní výpočetní výkon
ARM 100%
Thumb 75%
Thumb-2 98%

Z výsledků, které jsou prezentovány v předešlých dvou tabulkách tedy vyplývá, že pro testovanou aplikaci se díky použití instrukční sady Thumb-2 podařilo zmenšit velikost kódu na tři čtvrtiny původní velikosti a přitom výpočetní výkon poklesl pouze o zhruba 2% (zde se samozřejmě projevila i nižší pravděpodobnost výpadku instrukční cache, která ovšem byla nižší i u implementace využívající instrukce Thumb).

Poznámka: jako u všech podobných měření je samozřejmě nutné mít na paměti, že se jedná pouze o (reprezentativní) vzorek, který může ale taktéž nemusí odpovídat jinému typu algoritmu. Vždy záleží jen na konkrétní aplikaci, konkrétním vývojáři, jeho rozpočtu a času, zda si podobné měření udělá i v případě jím vyvíjené aplikace, nebo zda se spolehne na cizí statistiku :-) (to ovšem platí i pro výběr procesoru: opět záleží na mnoha okolnostech, včetně dosavadních zkušeností vývojáře, ceně za vývojové nástroje atd.).

4. Naplnění registru šestnáctibitovou konstantou, naplnění horní poloviny registru

Tvůrci instrukční sady Thumb-2 navrhli a implementovali celou řadu zcela nových instrukcí, které mj. odstraňovaly některé nedostatky původních instrukčních sad Thumb a ARM. Již několikrát jsme se například zmínili o problematice načtení konstanty do pracovního registru. V instrukční sadě Thumb-2 jsou již stávající možnosti práce s konstantami rozšířeny o dvě nové varianty instrukce MOV. Připomeňme si, že programátoři měli k dispozici obyčejnou instrukci MOV pracující s osmibitovou konstantou, která mohla být posunuta v barrel shifteru a taktéž instrukci MVN, která navíc konstantu negovala. Použití pouhé osmibitové konstanty (i když posunuté) však v mnoha případech nedostačovalo, proto se musely konstanty ukládat přímo do programového kódu (například za subrutinu) s tím, že se pro adresování těchto konstant používal registr PC s vhodným offsetem. Nejedná se o úplně špatné řešení, nicméně stále vyžaduje minimálně 64 bitů (32 bitů pro instrukci, 32 bitů pro konstantu).

Aby se velikost paměti potřebné pro uložení programu zmenšila, nabízí instrukční sada Thumb-2 navíc ještě instrukci MOVW (move wide), která ve svém instrukčním slovu obsahuje plnou šestnáctibitovou konstantu. Tato konstanta je uložena do spodní poloviny zvoleného cílového registru (bity 0 až 15) s tím, že horní polovina registru (bity 16 až 31) je vynulována. Této instrukci sekunduje instrukce MOVT (move top), která ve svém instrukčním slovu taktéž obsahuje šestnáctibitovou konstantu, ovšem tato konstanta je přenesena do horní poloviny zvoleného cílového registru (bity 16 až 31), přičemž jeho dolní polovina (bity 0 až 15) zůstává nezměněna. V mnoha případech postačuje použít pouze instrukci MOVW, která se v assembleru zapisuje obecnou mnemotechnickou zkratkou MOV (konkrétní instrukční slovo vybere sám assembler). Při nutnosti načtení plné 32bitové konstanty lze využít dvojici MOVW+MOVT s tím, že se díky lokalitě kódu (konstanta je uložena současně s instrukcemi) sníží pravděpodobnost výpadku instrukční vyrovnávací paměti.

5. Operace s bitovými poli uloženými v registrech

Mikroprocesory ARM nabízí vývojářům celou řadu aritmetických, logických i bitových instrukcí. Kromě klasických instrukcí pro součet a rozdíl byly postupně přidány i instrukce pro součet a rozdíl se saturací (tj. bez přetečení výsledku), součet a rozdíl po bajtech či slovech, různé typy násobení atd. U ARMv5 byla navíc přidána i zajímavá instrukce CLZ (Count Leading Zeros), která vrátila počet nul uložených na začátku vybraného zdrojového registru. Podobně je tomu u logických a bitových instrukcí. Mohlo by se tedy znát, že nabídka tohoto typu instrukcí je vlastně úplná a bude postačovat pro všechny potřeby programátorů. Ve skutečnosti však v praxi nastávají situace, kdy je nutné manipulovat pouze s vybraným bitovým polem (sekvencí bitů) uloženým v pracovním registru. Představme si například situaci, kdy se zpracovává bitmapa, v níž jsou jednotlivé pixely uloženy systémem hi-color, tj. například následovně: RRRRRGGGGGGBBBBB (šestnáct bitů na pixel, z toho pět bitů pro červenou složku, šest bitů pro složku zelenou a pět bitů pro složku modrou).

Pokud je programátor či překladač postaven před nutnost pracovat s takto uloženými daty, musí většinou použít instrukce pro bitové posuny zkombinované s instrukcemi pro maskování či selektivní nastavení některých bitů (AND, OR, XOR). V instrukční sadě Thumb-2 však může použít i čtveřici nových instrukcí nazvaných BFC, BFI, SBFX a UBFX. První z těchto instrukcí BFC získala svoji mnemotechnickou zkratku ze sousloví Bit Field Clear. Tato instrukce skutečně umožňuje vynulovat bitovou oblast v registru, která je specifikovaná svým začátkem (indexem nejnižšího bitu v oblasti) a šířkou. Obě zmíněné konstanty – začátek bitové oblasti a její šířka – jsou přitom součástí instrukčního slova.

Další tři instrukce jsou již poněkud složitější, protože pracují s dvojicí registrů: zdrojovým registrem a registrem cílovým. Instrukce BFI (Bit Field Insert) slouží k vložení n nejnižších bitů zdrojového registru do registru cílového, přičemž lze zvolit, od kterého bitu se vkládání bude provádět (obsah dalších bitů mimo zvolené bitové pole zůstane nezměněn). Instrukce SBFX (Signed Bit Field Extract) a UBFX (Unsigned Bit Field Extract) mají opačný význam: načtení vybraného bitového pole ze zdrojového registru a jeho uložení do registru cílového s případným znaménkovým rozšířením.

Poznámka: možná by se mohlo zdát, že se jedná o poměrně složité instrukce (už jejich popis je složitější než dejme tomu konstatování, že se „provede součet dvou registrů“), nicméně jejich implementace je i díky existenci barrel shifteru ve skutečnosti velmi jednoduchá a tím pádem i vyhovující filozofii RISC.

Podívejme se na jednoduchý příklad. Instrukce:

BFI r0, r1, #bitpos, #bitwidth

by se musela implementovat pomocí třech jiných instrukcí, které navíc musí využívat další pomocný pracovní registr:

AND r2, r1, #bitwidth                  ; pracujeme pouze s #bitwidth nejnižšími bity
BIC r0, r0, #bitwidth << bitpos
ORR r0, r0, r2, LSL #bitpos            ; posun druhého operandu na správnou pozici

6. Instrukce pro otočení všech bitů v pracovním registru

Připomeňme si, že mikroprocesory s architekturou ARM se používaly a dodnes používají v mnoha aplikačních oblastech. Jednou z těchto oblastí je i využití těchto mikroprocesorů pro zpracování signálů (DSP – Digital Signal Processing/Pro­cessor). V této oblasti je možné využít například již zmíněné sčítání a odčítání se saturací doplněné mnoha typy instrukcí pro násobení. V oblasti zpracování signálů se taktéž velmi často implementuje algoritmus rychlé Fourierovy transformace (FFT – Fast Fourier Transform) popř. téměř identický algoritmus zpětné rychlé Fourierovy transformace (IFFT – Inverse Fast Fourier Transform). Jedna z implementací tohoto algoritmu vyžaduje použít při adresaci prvků v poli index získaný reverzací bitů, tj. prohozením všech bitů v pracovním registru (b0 <> b31, b1 <> b30 … b15 <> b16). Tato zdánlivě jednoduchá operace se však musí provádět buď pomocí vhodné tabulky nebo s využitím většího množství instrukcí, což je v obou případech poměrně neefektivní.

Instrukce, která tuto reverzaci bitů provádí, se jmenuje příhodně RBIT. Tato instrukce využívá dva pracovní registry jako operandy. Prvním operandem je zdrojový registr Rm a druhým operandem registr cílový Rd. Popis operace prováděné instrukcí RBIT by mohl být zapsán následovně (i když se ve skutečnosti samozřejmě žádná smyčka neprovádí, protože celá reverzace je záležitostí jednoho taktu):

for (i = 0; i < 32; i++)
{
    Rd[i] = Rm[31 - i]
}

7. Instrukce Compare and branch if (non) zero

I další instrukce, s nimiž se dnes seznámíme, vznikly takovým způsobem, že tvůrci instrukční sady Thumb-2 analyzovali reálné potřeby programátorů. Všimli si, že se v programech velmi často vyskytuje sekvence instrukcí, které nejdřív porovnají obsah vybraného pracovního registru s nulou a posléze provedou podmíněný skok na základě toho, zda je onen pracovní registr skutečně nulový nebo naopak nenulový. Poměrně velké frekvenci této sekvence instrukcí se nelze ani divit, protože podobným způsobem mohou být implementovány například testy na hodnotu NULL, počítané smyčky, smyčky typu do-while v nichž je pravdivostní hodnota vyjádřena celým číslem, práce s ASCIIZ řetězci atd. Aby bylo možné zmenšit velikost binárního kódu programu a současně ho i urychlit, byly do instrukční sady Thumb-2 přidány dvě nové instrukce, které nejprve provedou porovnání pracovního registru s nulou a poté provedou skok, pokud je registr nulový či naopak není nulový. Součástí instrukčního slova je přitom i krátký offset umožňující provést skok do vzdálenosti PC+4 až PC+130.

První z těchto instrukcí provede skok, pokud je vybraný pracovní registr nulový:

CBZ Rn, offset   ; compare and branch if zero

Druhá instrukce provádí skok v přesně opačném případě, tj. tehdy, když má registr nenulovou hodnotu:

CBNZ Rn, offset   ; compare and branch if non zero

8. Prefixová instrukce If-Then

Z minulého a předminulého dílu tohoto seriálu již víme, že z instrukční sady Thumb byly mj. odstraněny i podmínkové bity, pomocí nichž bylo možné specifikovat, za jakých podmínek (kombinací příznakových bitů) se má daná operace provést. To je trošku škoda, protože právě díky podmínkovým bitům bylo možné eliminovat některé operace skoku, které jsou v mnoha ohledech problematické. Tvůrci instrukční sady Thumb-2 si toho byli vědomi a proto do této sady přidali jednu z nejzajímavějších instrukcí, které kdy pro RISCové mikroprocesory vznikly. Jedná se vlastně o instrukční prefix nazvaný IT podle sousloví if-then. Tento prefix může být aplikován na jednu až čtyři instrukce následující za prefixem. Ihned za prefixem IT se (bez mezery) udává, zda má být daná instrukce provedena při splnění podmínky (T – then) či naopak při jejím nesplnění (E – else). U první instrukce je automaticky předpokládáno T, tudíž se uvádí maximálně tři znaky T/E. Samozřejmě je taktéž nutné zapsat i testovanou podmínku – může se jednat o kódy používané jak u podmíněných skoků, tak i v podmínkových bitech:

Kód Význam Předchozí operace porovnání
EQ Z==1 (rovno) signed i unsigned
NE Z==0 (nerovno) signed i unsigned
CS C==1 (větší nebo rovno) unsigned
CC C==0 (menší než) unsigned
MI N==1 (záporný výsledek) signed
PL N==0 (kladný nebo nulový výsledek) signed
VS V==1 (přetečení) signed
VC V==0 (nedošlo k přetečení) signed
HI C==1 & Z==0 (vetší než) unsigned
LS C==0 | Z==1 (menší nebo rovno) unsigned
GE N==V (větší nebo rovno) signed
LT N!=V (menší než) signed
GT Z==0 & N==V (větší než) signed
LE Z==1 N!=V (menší nebo rovno) signed

V praxi to může znamenat, že zápis:

ITEEE EQ

značí, že pokud je nastaven příznak zero (rovnost), je provedena jen první instrukce následující za prefixem, kdežto další tři instrukce nebudou provedeny (třikrát „else“).

Pokud by se měly provést tři instrukce v případě kladného výsledku předchozího porovnání, použil by se zápis:

ITTT PL

Porovnejme si nyní tři identické algoritmy. První z nich je implementovaný s využitím instrukcí ARM s podmínkovými bi­ty:

        LDREQ r0,[r1]      ; if EQ then LDR
        LDRNE r0,[r2]      ; if NE then LDR
        ADDEQ r0, r3, r0   ; if EQ then ADD
        ADDNE r0, r4, r0   ; if NE then ADD

V případě použití instrukční sady Thumb musíme využít podmíněné skoky se všemi nepříjemnostmi, které z toho plynou:

root_podpora

        BNE L1             ; opačná podmínka - přeskočení instrukce
        LDR r0, [r1]
        ADD r0, r3, r0     ; máme štěstí: můžeme prohodit pořadí instrukcí
        B L2
L1
        LDR r0, [r2]
        ADD r0, r4, r0
L2

U instrukční sady Thumb-2 lze v tomto případu s výhodou použít prefixovou instrukci IT:

        ITETE EQ
        LDR r0, [r1]
        LDR r0, [r2]
        ADD r0, r3, r0
        ADD r0, r4, r0

Na závěr si ještě všechny tři implementace pro zajímavost porovnáme, a to jak z hlediska velikosti programového kódu, tak i z hlediska celkové doby trvání výpočtu:

Instrukční sada Velikost kódu Počet cyklů
ARM (RISC) 16 bajtů 4 cykly
Thumb 12 bajtů 4–20 cyklů
Thumb-2 10 bajtů 4–5 cyklů

9. Odkazy na Internetu

  1. Improving ARM Code Density and Performance
    New Thumb Extensions to the ARM Architecture Richard Phelan
  2. The ARM Processor Architecture
    http://www.ar­m.com/products/pro­cessors/techno­logies/instruc­tion-set-architectures.php
  3. Thumb-2 instruction set
    http://infocen­ter.arm.com/hel­p/index.jsp?to­pic=/com.arm.doc­.ddi0344c/Bei­iegaf.html
  4. Introduction to ARM thumb
    http://www.ee­times.com/dis­cussion/other/4024632/­Introduction-to-ARM-thumb
  5. ARM, Thumb, and ThumbEE instruction sets
    http://www.ke­il.com/suppor­t/man/docs/ar­masm/armasm_CEG­BEIJB.htm
  6. An Introduction to ARM Assembly Language
    http://dev.em­celettronica.com/in­troduction-to-arm-assembly-language
  7. Processors – ARM
    http://www.ar­m.com/products/pro­cessors/index­.php
  8. The ARM Instruction Set
    http://simple­machines.it/doc/ar­m_inst.pdf
  9. ARM Architecture (Wikipedia)
    http://en.wiki­pedia.org/wiki/AR­M_architecture
  10. BBC BASIC
    http://www.bbcba­sic.co.uk/bbcba­sic.html
  11. BBC BASIC
    http://mdfs.net/Sof­tware/BBCBasic/
  12. BBC BASIC (Z80) for the ZX Spectrum
    http://mdfs.net/Sof­tware/BBCBasic/Spec­trum/
  13. BBC BASIC (Wikipedia CZ)
    http://en.wiki­pedia.org/wiki/BBC_BA­SIC
  14. MIPS-3D® ASE
    http://www.mip­s.com/products/ar­chitectures/mips-3d-ase/
  15. An introduction to SPARC's SIMD offerings
    http://mikebu­rrell.wordpres­s.com/2007/12­/14/an-introduction-to-sparcs-simd-offerings/
  16. MIPS64TM Architecture for Programmers Volume IV-c: The MIPS-3DTM Application-Specific Extension to the MIPS64TM
    http://www.we­blearn.hs-bremen.de/ris­se/RST/docs/MIP­S/MD00099–2B-MIPS3D64-AFP-01.11.pdf
  17. Visual Instruction Set
    http://www.eno­tes.com/topic/Vi­sual_Instructi­on_Set
  18. NEON
    http://www.ar­m.com/products/pro­cessors/techno­logies/neon.php
  19. Architecture and Implementation of the ARM Cortex-A8 Microprocessor
    http://www.design-reuse.com/arti­cles/11580/ar­chitecture-and-implementation-of-the-arm-cortex-a8-microprocessor­.html
  20. Multimedia Acceleration eXtensions (Wikipedia)
    http://en.wiki­pedia.org/wiki/Mul­timedia_Accele­ration_eXtensi­ons
  21. AltiVec (Wikipedia)
    http://en.wiki­pedia.org/wiki/Al­tiVec
  22. Visual Instruction Set (Wikipedia)
    http://en.wiki­pedia.org/wiki/Vi­sual_Instructi­on_Set
  23. MAJC (Wikipedia)
    http://en.wiki­pedia.org/wiki/MAJC
  24. MDMX (Wikipedia)
    http://en.wiki­pedia.org/wiki/MDMX
  25. MIPS Multiply Unit
    http://program­medlessons.or­g/AssemblyTuto­rial/Chapter-14/ass14_3.html
  26. Silicon Graphics Introduces Enhanced MIPS Architecture
    http://bwrc.e­ecs.berkeley.e­du/CIC/otherpr/en­hanced_mips.html
  27. MIPS-3D (Wikipedia)
    http://en.wiki­pedia.org/wiki/MIPS-3D
  28. MIPS Technologies, Inc. announces new MIPS-3D technology to provide silicon-efficient 3D graphics acceleration
    http://www.design-reuse.com/new­s/2057/mips-mips-3d-technology-silicon-efficient-3d-graphics-acceleration.html
  29. MIPS-3D Built-in Function (gcc.gnu.org)
    http://gcc.gnu­.org/onlinedoc­s/gcc/MIPS_002d3D-Built_002din-Functions.html
  30. Baha Guclu Dundar:
    Intel MMX, SSE, SSE2, SSE3/SSSE3/SSE4 Architectures
  31. SSE (Streaming SIMD Extentions)
    http://www.son­gho.ca/misc/sse/sse­.html
  32. Timothy A. Chagnon: SSE and SSE2
    http://www.cs­.drexel.edu/~tc365/mpi-wht/sse.pdf
  33. Intel corporation: Extending the Worldr's Most Popular Processor Architecture
    http://downlo­ad.intel.com/techno­logy/architec­ture/new-instructions-paper.pdf
  34. SIMD architectures:
    http://arstechni­ca.com/old/con­tent/2000/03/sim­d.ars/
  35. Intel MMXTM Technology Overview
    Intel corporation, 1996
  36. MultiMedia eXtensions
    http://softpi­xel.com/~cwrig­ht/programmin­g/simd/mmx.phpi
  37. AMD K5 („K5“ / „5k86“)
    http://www.pcgu­ide.com/ref/cpu­/fam/g5K5-c.html
  38. Sixth Generation Processors
    http://www.pcgu­ide.com/ref/cpu­/fam/g6.htm
  39. Great Microprocessors of the Past and Present
    http://www.cpushac­k.com/CPU/cpu­1.html
  40. Very long instruction word (Wikipedia)
    http://en.wiki­pedia.org/wiki/Ve­ry_long_instruc­tion_word
  41. Tour of the Black Holes of Computing!: Floating Point
    http://www.cs­.hmc.edu/~geof­f/classes/hmc­.cs105…/slides/clas­s02_floats.ppt
  42. 3Dnow! Technology Manual
    AMD Inc., 2000
  43. CPU design (Wikipedia)
    http://en.wiki­pedia.org/wiki/CPU_de­sign
  44. Control unit (Wikipedia)
    http://en.wiki­pedia.org/wiki/Con­trol_unit
  45. Cray History
    http://www.cra­y.com/About/His­tory.aspx?404;http:­//www.cray.com:80/a­bout_cray/his­tory.html
  46. Cray Historical Timeline
    http://www.cra­y.com/Assets/PDF/a­bout/CrayTime­line.pdf
  47. Computer Speed Claims 1980 to 1996
    http://homepa­ge.virgin.net/ro­y.longbottom/mip­s.htm
  48. Superpočítače Cray
    http://www.ro­ot.cz/clanky/su­perpocitace-cray/
  49. Superpočítače Cray (druhá část)
    http://www.ro­ot.cz/clanky/su­perpocitace-cray-druha-cast/
  50. Superpočítače Cray (třetí část)
    http://www.ro­ot.cz/clanky/su­perpocitace-cray-treti-cast/
  51. Superpočítače Cray (čtvrtá část)
    http://www.ro­ot.cz/clanky/su­perpocitace-cray-ctvrta-cast/
  52. Superpočítače Cray (pátá část): architektura Cray X-MP
    http://www.ro­ot.cz/clanky/su­perpocitace-cray-pata-cast-architektura-pocitace-cray-x-mp-a-jeho-pouziti-ve-filmovem-prumyslu/

Byl pro vás článek přínosný?