Pohled programátora na mikroprocesory ARM

Pavel Tišnovský 13. 3. 2012

V dnešní části seriálu o architekturách počítačů budeme pokračovat v popisu RISCových mikroprocesorů s architekturou ARM. Především se seznámíme s instrukční sadou těchto mikroprocesorů, která se v několika ohledech odlišuje jak od CISCových mikroprocesorů, tak i od ostatních mikroprocesorů typu RISC.

Obsah

1. Mikroprocesory s architekturou ARM a jejich „RISCová“ instrukční sada

2. Registry přístupné programátorům

3. Pracovní registry a režimy mikroprocesorů ARM

4. Příznakové registry CPSR a SPSR

5. Typy instrukcí zpracovávaných mikroprocesory ARM

6. Formát instrukcí zpracovávaných mikroprocesory ARM

7. Jeden ze způsobů řešení problematiky podmíněných skoků: podmíněné spouštění instrukcí

8. Demonstrační příklad: použití podmíněného spouštění instrukcí

9. Odkazy na Internetu

1. Mikroprocesory s architekturou ARM a jejich „RISCová“ instrukční sada

V předchozí části seriálu o architekturách počítačů jsme se seznámili s historií vzniku mikroprocesorů s architekturou ARM a řekli jsme si základní informace o vlastnostech těchto procesorů, které je předurčují mj. i k použití v mobilních zařízeních. Dnes se zaměříme především na popis těchto mikroprocesorů z hlediska či spíše pohledu programátora, protože procesory ARM nabízí vývojářům hned několik unikátních vlastností, které u jiných architektur nenajdeme. Již minule jsme si řekli, že moderní varianty mikroprocesorů ARM mohou pracovat s několika instrukčními sadami, mezi kterými je možné se programově – a to i v rámci jedné aplikace – přepínat. Jedná se o původní „RISCovou“ instrukční sadu, v níž mají všechny instrukce shodnou šířku 32 bitů, dále pak o instrukční sadu nazvanou Thumb s instrukcemi o šířce 16 bitů, instrukční sadu Thumb 2, v níž mohou mít instrukce proměnnou délku a u některých čipů ARM se můžeme setkat i s podporou technologie Jazelle dovolující zpracovávat bajtkód JVM, tj. instrukce určené původně pro zpracování virtuálním strojem Javy (ve skutečnosti je však přímo zpracovávána pouze část těchto instrukcí, ostatní jsou implementovány podprogramem).

Nejdříve začneme s popisem původní „RISCové“ instrukční sady, která je současně i instrukční sadou v mnoha ohledech nejzajímavější. Jak jsme si již řekli v předchozím odstavci, mají všechny instrukce patřící do této instrukční sady šířku 32 bitů, a to včetně instrukcí určených pro načtení 32 bitové konstanty (zde muselo logicky dojít k určitému kompromisu). Těchto 32 bitů je podle typu instrukce rozděleno do několika bitových polí různé šířky, v nichž se nachází bitové příznaky, na nichž vykonání instrukce závisí (viz další kapitoly s podrobnějším popisem), operační kód instrukce, indexy registrů (operandů), s nimiž instrukce pracuje, konstanta použitá pro bitový posun či rotaci jednoho z operandů atd. U instrukcí LDM a STM je jedno bitové pole o šířce 16 bitů určeno pro označení těch pracovních registrů, které se mají načíst z operační paměti, popř. které se naopak mají do operační paměti uložit (i touto dvojicí instrukcí se ještě budeme v dalším textu podrobněji zabývat).

2. Registry přístupné programátorům

Vzhledem k tomu, že u všech mikroprocesorů s architekturou RISC je díky existenci instrukční pipeline pro každou instrukci v ideálním případě vyhrazena pouze jedna operace přístupu k operační paměti (konkrétně se jedná o čtení operačního kódu instrukce), je nutné, aby tyto mikroprocesory obsahovaly na svém čipu velký počet pracovních registrů. Na druhou stranu však pevná šířka instrukčních slov (typicky 32 bitů) vede k tomu, že v jedné instrukci lze indexovat pouze omezený počet pracovních registrů, protože RISCové instrukce většinou neobsahují implicitní operandy (opačným extrémem je instrukční sada šestnáctibitových mikroprocesorů Intel 8086 obsahující mnoho instrukcí s implicitním operandem či operandy).

Jak jsme se již dozvěděli v předchozích částech tohoto seriálu, vedly tyto dva protichůdné požadavky – velký počet pracovních registrů/omezená šířka instrukcí – k tomu, že někteří konstruktéři mikroprocesorů RISC (počínaje projektem Berkeley RISC) zaváděli takzvaná „registrová okna“, která programátorům v daný okamžik zpřístupňovala pouze určitý výsek z celé sady registrů. Velikost registrových oken je různá, počínaje osmi registry (projekt Berkeley RISC) až po proměnný počet registrů v registrovém okně (příkladem mohou být mikroprocesory řady AMD 29000).

Konstruktéři mikroprocesorů ARM se však vydali poněkud odlišnou cestou a namísto registrových oken (posouvaných většinou při volání podprogramu a návratu z podprogramu) použili v uživatelském (neprivilegovaném) režimu pouze jednu sadu registrů, podobně, jako je tomu například u RISCových mikroprocesorů MIPS. Existence jedné sady registrů znamená, že se o alokaci registrů pro různé operandy musí starat překladač, a to samozřejmě i v případě volání podprogramů (subrutin). Ovšem vzhledem k tomu, že je vhodné, aby mikroprocesor dokázal velmi rychle zpracovávat přerušení či vykonávat funkce jádra operačního systému, existuje u architektury ARM ve skutečnosti několik registrů dostupných pouze v přerušovací rutině, v supervisorském režimu atd. Instrukční sada samozřejmě zůstává ve všech režimech stále stejná, proto programátor v jakémkoli režimu může pracovat se stejným počtem pracovních registrů. Na tomto místě je taktéž vhodné upozornit na to, že se počet režimů mikroprocesorů ARM postupně zvyšoval, stejně jako počet speciálních registrů dostupných pouze v jednom režimu – viz též následující kapitolu.

3. Pracovní registry a režimy mikroprocesorů ARM

V předchozí kapitole jsme si řekli, že počet režimů mikroprocesoru a současně i počet „speciálních“ pracovních registrů (přístupných pouze z jednoho režimu) se postupně zvyšoval. Následující tabulka se šesti režimy procesoru je z tohoto důvodu platná pro mikroprocesory ARM patřící do rodiny ARM 7, nikoli například pro první dvě generace procesorů ARM1 a ARM2. Povšimněte si, že prvních osm pracovních registrů je dostupných v jakémkoli režimu procesoru, stejně jako registr r15 sloužící jako programový čítač PC (ostatně přidání programového čítače mezi „běžné“ pracovní registry je jednou z typických vlastností mikroprocesorů ARM):

Index/Režim User FIQ Supervisor Abort IRQ Undefined
0 r0 r0 r0 r0 r0 r0
1 r1 r1 r1 r1 r1 r1
2 r2 r2 r2 r2 r2 r2
3 r3 r3 r3 r3 r3 r3
4 r4 r4 r4 r4 r4 r4
5 r5 r5 r5 r5 r5 r5
6 r6 r6 r6 r6 r6 r6
7 r7 r7 r7 r7 r7 r7
8 r8 r8_fiq r8 r8 r8 r8
9 r9 r9_fiq r9 r9 r9 r9
10 r10 r10_fiq r10 r10 r10 r10
11 r11 r11_fiq r11 r11 r11 r11
12 r12 r12_fiq r12 r12 r12 r12
13 r13 r13_fiq r13_svc r13_abt r13_irq r13_undef
14 r14 r14_fiq r14_svc r14_abt r14_irq r14_undef
15 r15/PC r15/PC r15/PC r15/PC r15/PC r15/PC

Z tabulky je patrné, že mikroprocesory ARM 7 sice obsahují 31 pracovních registrů, ovšem v každém režimu mikroprocesoru má programátor přístup pouze k šestnácti registrům, přičemž registr r15 je vždy považován za programový čítač (to ovšem neznamená, že se do něj nemůže provádět zápis – ve skutečnosti je tomu právě naopak).

4. Příznakové registry CPSR a SPSR

Kromě pracovních registrů a programového čítače obsahují mikroprocesory s architekturou ARM i registry, v nichž se uchovávají různé příznaky. V uživatelském režimu se pracuje s příznaky uloženými v registru nazvaném CPSR (Current Program Status Register) a pro každý další režim existuje navíc zvláštní registr nazvaný SPSR (Saved Program Status Register), v němž jsou uchovány původní příznaky ze CPSR (zatím jsme se tedy úspěšně vyhnuli nutnosti použití zásobníku :-). Podobně jako všechny pracovní registry, mají i registry CPSR a SPSR_? shodnou šířku 32 bitů, což má svoje výhody. Mimo jiné i to, že šířka 32 bitů ponechala konstruktérům procesorů ARM mnoho prostoru pro uložení různých důležitých informací do registrů CPSR/SPSR, takže se nemuseli uchylovat k nepříliš promyšleným technikám známým například z platformy x86, kde se původně šestnáctibitový registr FLAGS (8086) postupně změnil na 32bitový registr EFLAGS (80386), vedle něho vznikl registr MSW (80286) rozšířený na CR0 atd. atd.

Ve stavových registrech CPSR/SPSR mikroprocesorů ARM jsou uloženy především bitové příznaky nastavované aritmeticko-logickou jednotkou, dále pak bity určující, jakou instrukční sadu mikroprocesor právě zpracovává (ARM, Thumb, Jazelle), příznak pořadí zpracovávání bajtů (little/big endian) a taktéž příznaky používané u SIMD operací. Zdaleka ne všechny mikroprocesory ARM však skutečně pracují se všemi bity, což je logické, protože například příznak Q je používán jen u mikroprocesorů podporujících aritmetiku se saturací, příznak J u čipů s podporou technologie Jazelle atd.:

Příznak Význam zkratky Poznámka
N negative výsledek ALU operace je záporný
V overflow přetečení (znaménková aritmetika)
Z zero výsledek je nulový
C carry přenos (bezznaménková aritmetika)
I interrupt zákaz IRQ (přerušení)
F fast interrupt zákaz FIRQ (rychlého přerušení)
Q sticky overflow aritmetika se saturací, od ARMv5e výše
T thumb příznak zpracování instrukční sady Thumb (jen u procesorů se znakem „T“ v názvu)
J jazelle příznak zpracování instrukční sady Jazelle (jen u procesorů se znakem „J“ v názvu)
E endianness pořadí bajtů při práci s RAM (big/little endian)
GE 4 bity použito u SIMD operací (pouze některé čipy)
IF 5 bitů použito u instrukcí Thumb2 (pouze některé čipy)
M 5 bitů režim práce mikroprocesoru (user, IRQ, FIRQ, …)

Poznámka: v tabulce zobrazené výše nejsou jednotlivé bity uvedeny v takovém pořadí, v jakém se nachází ve stavovém registru.

5. Typy instrukcí zpracovávaných mikroprocesory ARM

Instrukční sada mikroprocesorů ARM obsahuje několik typů instrukcí. V první řadě se samozřejmě jedná o instrukce typu Load a Store určené pro načtení či naopak uložení obsahu pracovních registrů do operační paměti (mezi operace typu Load se zde počítá i načtení konstanty). Dále jsou v instrukční sadě přítomny aritmetické operace, logické a bitové operace, skoky (jeden typ skoku současně může změnit i instrukční sadu mikroprocesoru), instrukce pro práci se stavovými registry CPSR popř. SPSR a několik instrukčních kódů je taktéž vyhrazeno pro komunikaci a řízení koprocesorů, například matematického koprocesoru, GPU atd. Povšimněte si, že jsme se prozatím nezmínili o instrukcích pro provádění bitových posunů a rotací, což je správně, protože tyto instrukce ve skutečnosti na procesorech ARM samostatně neexistují (stále se bavíme o původní RISCové instrukční sadě). Velká část ALU instrukcí totiž umožňuje, aby se bitový posun či rotace vykonal v barrel shifteru se druhým operandem vstupujícím do ALU, takže se bitový posun/rotace musí zakódovat do některé ALU instrukce, popř. do instrukce přenosu dat (to je většinou záležitostí překladače):

  1. Instrukce typu load/store prováděné s jedním pracovním registrem.
  2. Instrukce typu load/store prováděné s 0 až 16 pracovními registry.
  3. Aritmetické operace.
  4. Logické a bitové operace.
  5. Skoky a změna instrukční sady mikroprocesoru.
  6. Práce se stavovými registry CPSR a SPSR.
  7. Instrukce koprocesoru

6. Formát instrukcí zpracovávaných mikroprocesory ARM

V této kapitole si stručně popíšeme formát instrukcí mikroprocesorů ARM. Instrukční slovo o konstantní šířce 32 bitů je rozděleno do několika částí. V prvních čtyřech bitech se u všech instrukcí nachází kód podmínky, jehož význam bude vysvětlen v následující kapitole. Za kódem podmínky je uložen vlastní operační kód instrukce o šířce 4 až 8 bitů, který bývá u některých typů instrukcí navíc doplněn dalšími bity (například se to týká instrukcí násobení, kde lze pomocí těchto bitů zvolit režim násobení a typ výsledku). Další obsah instrukčního slova se liší podle toho, o jaký typ instrukce se jedná. Například u skoků je operační kód instrukce široký pouze čtyři bity, což ponechává celých 24 bitů pro uložení offsetu skoku. Většina aritmetických instrukcí obsahuje v instrukčním slově indexy dvou pracovních registrů (každý po 4 bitech) a navíc dvanáctibitový operand s různým významem. Výjimku tvoří instrukce pro násobení, které v instrukčním kódu obsahují indexy hned čtyř registrů: Rd, Rn, Rs a Rm. Další výjimkou jsou již zmíněné instrukce LDM a STM, kde se ve spodní polovině instrukce, tj. v šestnácti bitech, nachází bitové pole určující, které registry mají být přečteny či zapsány do operační paměti.

Pod tímto odstavcem je naznačen formát některých typů instrukcí mikroprocesorů ARM. Kromě posledního formátu má operační kód šířku osm bitů, v případě skoků (poslední formát) pak pouze čtyři bity, protože zbývajících 24 bitů je použito pro uložení offsetu skoku:

31     27           15                  0
+------+--------------------------------+
| cond | opkód | Rn | Rd |  operand 2   |
+------+--------------------------------+
| cond | opkód | Rn | Rd | Rs | op.| Rm |
+------+--------------------------------+
| cond | opkód | Rn | Rd |  offset      |
+------+--------------------------------+
 
Instrukce LDM a STM:
31     27           15                  0
+------+--------------------------------+
| cond | opkód | Rn |  bitové pole reg. |
+------+--------------------------------+
 
Instrukce skoku:
31     27    23                         0
+------+--------------------------------+
| cond |opkód|       offset skoku       |
+------+--------------------------------+

7. Jeden ze způsobů řešení problematiky podmíněných skoků: podmíněné spouštění instrukcí

Pokud se podíváme na formát instrukcí zobrazený v předchozí kapitole, můžeme vidět, že se v nejvyšších čtyřech bitech každé instrukce nachází takzvaný kód podmínky. Konstruktéři mikroprocesorů ARM totiž (částečně) vyřešili problematiku podmíněných skoků tím, že umožnili vykonat každou instrukci pouze v případě, že je splněna podmínka, jejích kód je zapsán právě v oněch čtyřech nejvyšších bitech instrukce. A o jakou problematiku podmíněných skoků se vlastně jedná? Podmíněné skoky představují pro klasickou RISCovou pipeline obtížný úkol: důvodem existence instrukční pipeline je to, aby se v každém taktu v ideálním případě dokončila jedna instrukce. U skoků, zvláště těch podmíněných, se však již před rozhodnutím, zda se skok provede či nikoli, začnou zpracovávat další instrukce umístěné za skokem, což však znamená, že se v případě provedení skoku tyto instrukce ve skutečnosti nemají vykonat. Konstruktéři RISCových a posléze i CISCových mikroprocesorů tedy hledali různé způsoby řešení této problematiky, ať se již jedná o spekulativní provádění instrukcí (příliš mnoho tranzistorů) či o prediktory skoků (ne vždy jsou úspěšné).

Díky tomu, že u mikroprocesorů ARM lze podmínku vykonání zadat u každé instrukce, je možné, aby se celkový počet podmíněných skoků v programu minimalizoval. Zejména se to týká skoků používaných pro implementaci programové konstrukce if-then-else, kde se v jednotlivých větvích nachází jen malé množství instrukcí. Aby však mělo použití podmínkových kódů smysl, musela se změnit ještě jedna vlastnost procesorů ARM: jejich aritmeticko-logická jednotka totiž změní stavové bity carry, zero, overflow a negative pouze v tom případě, že je to explicitně v instrukčním kódu zapsáno (výjimku tvoří porovnávací instrukce). Touto vlastností se budeme zabývat až v následující části seriálu.

První sada podmínkových kódů se používá pro provedení či naopak neprovedení instrukce na základě hodnoty jednoho z příznakových bitů zero, overflow či negative. Poslední podmínkový kód z této skupiny má název AL (Any/Always) a značí, že se instrukce provede v každém případě. Tento podmínkový kód se tudíž většinou v assembleru nezapisuje, protože je považován za implicitní:

Kód Přípona Význam Testovaná podmínka
0000 EQ Z set rovnost (či nulový výsledek)
0001 NE Z clear nerovnost (či nenulový výsledek)
0100 MI N set výsledek je záporný
0101 PL N clear výsledek je kladný či 0
0110 VS V set nastalo přetečení
0111 VC V clear nenastalo přetečení
1110 AL Any/Always většinou se nezapisuje, implicitní podmínka

Další čtyři podmínkové kódy se většinou používají při porovnávání dvou hodnot bez znaménka (unsigned). V těchto případech se testují stavy příznakových bitů carry a zero, přesněji řečeno kombinací těchto bitů:

Kód Přípona Význam Testovaná podmínka
0010 CS/HS C set >=
0011 CC/LO C clear <
1000 HI C set and Z clear >
1001 LS C clear or Z set <=

Poslední čtyři podmínkové kódy se používají pro porovnávání hodnot se znaménkem (signed). V těchto případech se namísto příznakových bitů carry a zero testují kombinace bitů negative, overflow a zero:

Kód Přípona Význam Testovaná podmínka
1010 GE N and V the same >=
1011 LT N and V differ <
1100 GT Z clear, N == V >
1101 LE Z set, N != V <=

8. Demonstrační příklad: použití podmíněného spouštění instrukcí

Pojďme si nyní ukázat, jak je možné použít podmínkové kódy v praxi. Následující demonstrační příklad byl získán přímo z materiálů dodávaných k mikroprocesorům ARM, takže je jisté, že byl vybrán s ohledem na to, aby dobře ilustroval použití podmínkových kódů a markantní rozdíl v délce programu i délce jeho trvání (v praxi jsou tyto rozdíly poněkud menší). Příklad představuje céčkovskou funkci určenou pro výpočet největšího společného dělitele dvou 32bitových hodnot. Algoritmus pro výpočet největšího společného dělitele lze v céčku zapsat následovně:

int gcd(int a, int b)
{
    while (a != b) do
    {
        if (a > b)
        {
            a = a - b;
        }
        else
        {
            b = b - a;
        }
    }
    return a;
}

Pokud by tento algoritmus byl přeložen do assembleru s využitím klasicky pojatých podmíněných skoků, mohl by výsledek vypadat následovně. Instrukce CMP porovná dva pracovní registry obsahující obě hodnoty, pro něž se počítá největší společný dělitel. Na základě tohoto porovnání se vykoná buď „větev if“ nebo „větev else“, což ovšem znamená, že se v každé iteraci musí vykonat dvě instrukce podmíněných skoků (BEQ, BLT) a jedna instrukce skoku nepodmíněného (B):

gcd     CMP      r0, r1      ; porovnání registrů r0 a r1
        BEQ      end         ; pokud r0 == r1, konec smyčky
        BLT      less        ; skok když r0 je menší než r1
        SUB      r0, r0, r1  ; tělo "if"
        B        gcd         ; další iterace
less
        SUB      r1, r1, r0  ; tělo "else"
        B        gcd         ; další iterace
end

Naproti tomu optimalizující překladač může výše uvedený program přeložit pouze do čtyř instrukcí, přičemž obě prostřední instrukce jsou vykonány pouze při splnění zadané podmínky (viz suffix uvedený u jména instrukce):

widgety

gcd
        CMP      r0, r1      ; porovnání registrů r0 a r1
        SUBGT    r0, r0, r1  ; rozdíl jen v případě, že r0 byl větší než r1
        SUBLT    r1, r1, r0  ; rozdíl jen v případě, že r1 byl větší než r0
        BNE      gcd         ; pokud r0 != r1, skok na začátek smyčky

Vzhledem k tomu, že všechny instrukce mají konstantní šířku 32 bitů, odpovídá zkrácení programu v assembleru (počet ušetřených řádků) přímo úměrně i zkrácení výsledného strojového programu a současně i jeho rychlejšímu běhu, protože provedení podmíněného skoku vede k pozastavení instrukční pipeline na tři takty:

Program Instrukcí Bajtů
A 7 28
B 4 16

Poznamenejme, že v případě použití instrukční sady Thumb lze původní program se sedmi instrukcemi zkrátit na 14 bajtů, a to díky tomu, že se pro každou instrukci použije pouze 16 bitů.

9. Odkazy na Internetu

  1. An Introduction to ARM Assembly Language
    http://dev.em­celettronica.com/in­troduction-to-arm-assembly-language
  2. Processors – ARM
    http://www.ar­m.com/products/pro­cessors/index­.php
  3. The ARM Instruction Set
    http://simple­machines.it/doc/ar­m_inst.pdf
  4. ARM Architecture (Wikipedia)
    http://en.wiki­pedia.org/wiki/AR­M_architecture
  5. BBC BASIC
    http://www.bbcba­sic.co.uk/bbcba­sic.html
  6. BBC BASIC
    http://mdfs.net/Sof­tware/BBCBasic/
  7. BBC BASIC (Z80) for the ZX Spectrum
    http://mdfs.net/Sof­tware/BBCBasic/Spec­trum/
  8. BBC BASIC (Wikipedia CZ)
    http://en.wiki­pedia.org/wiki/BBC_BA­SIC
  9. MIPS-3D® ASE
    http://www.mip­s.com/products/ar­chitectures/mips-3d-ase/
  10. An introduction to SPARC's SIMD offerings
    http://mikebu­rrell.wordpres­s.com/2007/12­/14/an-introduction-to-sparcs-simd-offerings/
  11. 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
  12. Visual Instruction Set
    http://www.eno­tes.com/topic/Vi­sual_Instructi­on_Set
  13. NEON
    http://www.ar­m.com/products/pro­cessors/techno­logies/neon.php
  14. 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
  15. Multimedia Acceleration eXtensions (Wikipedia)
    http://en.wiki­pedia.org/wiki/Mul­timedia_Accele­ration_eXtensi­ons
  16. AltiVec (Wikipedia)
    http://en.wiki­pedia.org/wiki/Al­tiVec
  17. Visual Instruction Set (Wikipedia)
    http://en.wiki­pedia.org/wiki/Vi­sual_Instructi­on_Set
  18. MAJC (Wikipedia)
    http://en.wiki­pedia.org/wiki/MAJC
  19. MDMX (Wikipedia)
    http://en.wiki­pedia.org/wiki/MDMX
  20. MIPS Multiply Unit
    http://program­medlessons.or­g/AssemblyTuto­rial/Chapter-14/ass14_3.html
  21. Silicon Graphics Introduces Enhanced MIPS Architecture
    http://bwrc.e­ecs.berkeley.e­du/CIC/otherpr/en­hanced_mips.html
  22. MIPS-3D (Wikipedia)
    http://en.wiki­pedia.org/wiki/MIPS-3D
  23. 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
  24. MIPS-3D Built-in Function (gcc.gnu.org)
    http://gcc.gnu­.org/onlinedoc­s/gcc/MIPS_002d3D-Built_002din-Functions.html
  25. Baha Guclu Dundar:
    Intel MMX, SSE, SSE2, SSE3/SSSE3/SSE4 Architectures
  26. SSE (Streaming SIMD Extentions)
    http://www.son­gho.ca/misc/sse/sse­.html
  27. Timothy A. Chagnon: SSE and SSE2
    http://www.cs­.drexel.edu/~tc365/mpi-wht/sse.pdf
  28. Intel corporation: Extending the Worldr's Most Popular Processor Architecture
    http://downlo­ad.intel.com/techno­logy/architec­ture/new-instructions-paper.pdf
  29. SIMD architectures:
    http://arstechni­ca.com/old/con­tent/2000/03/sim­d.ars/
  30. Tour of the Black Holes of Computing!: Floating Point
    http://www.cs­.hmc.edu/~geof­f/classes/hmc­.cs105…/slides/clas­s02_floats.ppt
  31. 3Dnow! Technology Manual
    AMD Inc., 2000
  32. Intel MMXTM Technology Overview
    Intel corporation, 1996
  33. MultiMedia eXtensions
    http://softpi­xel.com/~cwrig­ht/programmin­g/simd/mmx.phpi
  34. AMD K5 („K5“ / „5k86“)
    http://www.pcgu­ide.com/ref/cpu­/fam/g5K5-c.html
  35. Sixth Generation Processors
    http://www.pcgu­ide.com/ref/cpu­/fam/g6.htm
  36. Great Microprocessors of the Past and Present
    http://www.cpushac­k.com/CPU/cpu­1.html
  37. Very long instruction word (Wikipedia)
    http://en.wiki­pedia.org/wiki/Ve­ry_long_instruc­tion_word
  38. CPU design (Wikipedia)
    http://en.wiki­pedia.org/wiki/CPU_de­sign
  39. Control unit (Wikipedia)
    http://en.wiki­pedia.org/wiki/Con­trol_unit
  40. Cray History
    http://www.cra­y.com/About/His­tory.aspx?404;http:­//www.cray.com:80/a­bout_cray/his­tory.html
  41. Cray Historical Timeline
    http://www.cra­y.com/Assets/PDF/a­bout/CrayTime­line.pdf
  42. Computer Speed Claims 1980 to 1996
    http://homepa­ge.virgin.net/ro­y.longbottom/mip­s.htm
  43. Superpočítače Cray
    http://www.ro­ot.cz/clanky/su­perpocitace-cray/
  44. Superpočítače Cray (druhá část)
    http://www.ro­ot.cz/clanky/su­perpocitace-cray-druha-cast/
  45. Superpočítače Cray (třetí část)
    http://www.ro­ot.cz/clanky/su­perpocitace-cray-treti-cast/
  46. Superpočítače Cray (čtvrtá část)
    http://www.ro­ot.cz/clanky/su­perpocitace-cray-ctvrta-cast/
  47. 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/
Našli jste v článku chybu?
Vitalia.cz: Jsou vegani a vyrábějí nemléko

Jsou vegani a vyrábějí nemléko

Lupa.cz: Cimrman má hry na YouTube i vlastní doodle

Cimrman má hry na YouTube i vlastní doodle

Vitalia.cz: Vím, co se učíš, ale netuším, co piješ

Vím, co se učíš, ale netuším, co piješ

Vitalia.cz: Tesco nabízí desítky tun jídla zdarma

Tesco nabízí desítky tun jídla zdarma

Vitalia.cz: Muž, který miluje příliš. Ženám neimponuje

Muž, který miluje příliš. Ženám neimponuje

DigiZone.cz: Rapl: seriál, který vás smíří s ČT

Rapl: seriál, který vás smíří s ČT

DigiZone.cz: Funbox 4K v DVB-T2 má ostrý provoz

Funbox 4K v DVB-T2 má ostrý provoz

120na80.cz: Galerie: Čínští policisté testují českou minerálku

Galerie: Čínští policisté testují českou minerálku

DigiZone.cz: Wimbledon na Nova Sport až do 2019

Wimbledon na Nova Sport až do 2019

DigiZone.cz: DVB-T2 ověřeno: seznam TV zveřejněn

DVB-T2 ověřeno: seznam TV zveřejněn

Vitalia.cz: Tohle jsou nejlepší česká piva podle odborníků

Tohle jsou nejlepší česká piva podle odborníků

Podnikatel.cz: Nemá dluhy? Zjistíte to na poště

Nemá dluhy? Zjistíte to na poště

Vitalia.cz: Jak Ondra o astma přišel

Jak Ondra o astma přišel

120na80.cz: Co je padesátkrát sladší než cukr?

Co je padesátkrát sladší než cukr?

Podnikatel.cz: Udělali jsme velkou chybu, napsal Čupr

Udělali jsme velkou chybu, napsal Čupr

Vitalia.cz: Tradiční čínská medicína a rakovina

Tradiční čínská medicína a rakovina

Vitalia.cz: dTest odhalil ten nejlepší kečup

dTest odhalil ten nejlepší kečup

Podnikatel.cz: Takhle se prodávají mražené potraviny

Takhle se prodávají mražené potraviny

Vitalia.cz: Tahák, jak vyzrát nad zápachem z úst

Tahák, jak vyzrát nad zápachem z úst

Lupa.cz: Adblock Plus začal prodávat reklamy

Adblock Plus začal prodávat reklamy