Hlavní navigace

Superpočítače Cray (čtvrtá část)

14. 10. 2010
Doba čtení: 18 minut

Sdílet

Dnes si popíšeme architekturu superpočítače Cray-2. Zaměříme se na to, proč byla původně homogenní paměť rozdělena na část globální a lokální, popíšeme si činnost některých instrukcí pracujících s vektory a řekneme si, jak se mohly výkonné jednotky (procesory) mezi sebou synchronizovat pomocí semaforů.

Obsah

1. Moduly superpočítače Cray-2 a metody zvýšení jeho výpočetního výkonu

2. Malé ohlédnutí do minulosti: registrová sada počítačů Cray 1, Cray X-MP a Cray Y-MP

3. Lokální paměti počítače Cray-2 a jeho upravená registrová sada

4. Synchronizace procesorových jednotek pomocí semaforů

5. Základní operace s registrem VM

6. Přiřazení hodnoty do vektorového registru s využitím masky

7. Malý úkol pro čtenáře

8. Další operace s vektory

9. Odkazy na Internetu

1. Moduly superpočítače Cray-2 a metody zvýšení jeho výpočetního výkonu

V předchozí části seriálu o historii vývoje výpočetní techniky jsme si popsali funkce základních prvků (modulů), ze kterých byl sestaven superpočítač Cray-2. Víme již, že každý modul byl zkonstruován z osmi plošných spojů vzájemně propojených pomocí takzvaných z-pinů (z-pins), které můžeme vidět i na prvních dvou fotografiích. Na plošných spojích se nacházely převážně integrované obvody různého typu, z nichž byla sestavena jak operační paměť (rozdělená na několik samostatných oblastí popsaných dále), tak i vlastní procesorové jednotky. Všechny čipy osazené na osmici plošných spojů tvořily mřížku o rozměrech 8×8×12 čipů. Vzhledem k tomu, že se superpočítač Cray 2 skládal z 320 takovýchto modulů, lze jednoduše vypočítat, že celkový počet čipů přesáhl hodnotu čtvrt milionu (8×8×12×320), které společně tvořily systém se špičkovým výpočetním výkonem téměř 1,9 GFLOPS, který byl více než desetinásobný oproti výpočetnímu výkonu Craye-1 se 160 MFLOPS.

Obrázek 1: Osm plošných spojů osazených čipy, které tvoří jeden modul počítače Cray-2. Mezi plošnými spoji jsou vytvořeny propojky – takzvané z-piny (z-pins).
(zdroj: http://bobody­ne.com/web-docs/robots/cra­y2/)

Tohoto výkonu, který překonal všechny tehdejší počítače, bylo dosaženo (samozřejmě kromě zkrácení hodinového cyklu) jak použitím většího množství jednotek umožňujících provádění výpočtů se skalárními hodnotami i s vektory, tak i rozdělením původně monolitické operační paměti, která začala tvořit úzké hrdlo celého systému, na několik částí. Obě metody zvýšení výpočetního výkonu si popíšeme v následujícím textu. Aby Seymour Cray dosáhl alespoň plánovaného desetinásobného urychlení výpočetního výkonu oproti původnímu Crayi 1, použil ve svém novém stroji čtyři samostatně pracující procesorové jednotky, které byly specializovány na provádění výpočtů s numerickými hodnotami uloženými v systému plovoucí řádové tečky a na manipulaci s daty. Tyto procesorové jednotky, nazývané také background processors, byly řízeny pátým procesorem nazývaným foreground processor. Zajímavé bylo, že každý typ procesorové jednotky měl vlastní instrukční sadu a pracoval s odlišnými registry. Background procesory měly k dispozici skalární, vektorové a adresové registry popsané ve třetí kapitole, foreground procesor naproti tomu používal několik registrů řídicích přístup do hlavní paměti a taktéž vzájemnou synchronizaci background procesorů.

Obrázek 2: Jeden z plošných spojů obsahujících paměťové čipy, mezi nimiž můžeme vidět z-piny sloužící k propojení jednotlivých plošných spojů v rámci jednoho modulu.

Foreground procesor celý počítač v podstatě ovládal – spouštěl načítání a ukládání dat, řídil přístup ke kanálům umožňujícím přenos slov mezi hlavní pamětí a paměťmi lokálními (přenosy bylo možné provádět přes skalární registry S nebo vektorové registry V; viz další text) a taktéž posílal jednotlivým background procesorům instrukce přes několik bufferů, z nichž každý měl kapacitu šestnácti slov (základní instrukce měly většinou délku právě jednoho slova). Hlavní úlohou foreground procesoru bylo efektivní rozdělení práce jednotlivým background procesorům takovým způsobem, aby byly vektorové výpočetní jednotky optimálně vytíženy, ale aby současně nedocházelo ke zbytečným přenosům dat mezi hlavní pamětí a paměťmi lokálními. V neposlední řadě taktéž bylo nutné zabránit konfliktům při přístupu do stejné oblasti hlavní paměti (ostatně velmi podobné problémy musejí být řešeny na architekturách NUMA, s nimiž má počítač Cray 2 velmi mnoho společných vlastností).

2. Malé ohlédnutí do minulosti: registrová sada počítačů Cray 1, Cray X-MP a Cray Y-MP

V předchozích článcích, v nichž byla popsána architektura počítače Cray-1, tj. nepřímého předchůdce Craye-2, jsme si mj. řekli, že tento počítač dával programátorům k dispozici velmi rozsáhlou sadu pracovních registrů, z nichž mnohé měly speciální použití. Z tohoto důvodu byly registry podle své funkce rozděleny do několika kategorií, přičemž každá kategorie byla označena jedním písmenem (v assembleru se jména konkrétních registrů doplňovala jejich indexem: S0, V8, T42 atd.). Jedná se především o vektorové registry V, skalární registry S a registry A používané pro adresování operandů. Skalární registry S byly navíc doplněny sadou šedesáti čtyř „záložních“ registrů T a adresní registry A sadou 64 „záložních“ registrů B. Tyto záložní sady registrů sloužily jako rychlá mezipaměť, což se v plné míře ukázalo až u Craye 2, kde byly tyto registry nahrazeny skutečnou lokální pamětí s mnohem větší (256×) kapacitou.

Obrázek 3: Pohled na jeden modul (osmici plošných spojů) ze strany konektoru. Přes tyto piny komunikoval modul s ostatními moduly nainstalovanými v superpočítači.
(zdroj: http://bobody­ne.com/web-docs/robots/cra­y2/)

Registry z odlišných kategorií byly zpracovávány různými funkčními jednotkami, což mj. znamená, že například s registry používanými pro adresování bylo možné provádět operace součtu, rozdílu či násobení konstantou, nikoli však kupříkladu výpočet převrácené hodnoty, což je naopak operace dostupná pro registry spadající do kategorie S (skalární registry). Zcela speciální kategorií pak byla osmice registrů V, protože každý z těchto registrů mohl obsahovat vektor šedesáti čtyř numerických hodnot uložených ve formátu plovoucí řádové tečky (neodpovídajících však přesně normě IEEE 754, ale speciálnímu „Cray formátu“). V následující tabulce jsou pro připomenutí vypsány všechny registry dostupné assemblerovským programátorům počítačů Cray 1 a jeho přímých následovníků Cray X-MP a Cray Y-MP:

Označení Počet registrů v sadě Bitová šířka Poznámka
S 8 64 bitů sada registrů pro běžné skalární operace
T 64 64 bitů tyto registry mají funkci mezipaměti pro registry S
A 8 32 bitů registry použité při adresování (u původního Craye 1 je bitová šířka adresových registrů zmenšena na 24 bitů)
B 64 32 bitů tyto registry mají funkci mezipaměti pro registry A
I 4 32×64-bitová slova též se zpracovávají jako 128×16-bitová slova
V 8 64×64 bitů vektorové registry; každý registr je ve skutečnosti 64prvkovým vektorem
VM 1 64 bitů vector mask (použito spolu s vektorovými registry pro některé operace)
VL 6 6 bitů vector length (použito spolu s vektorovými registry pro některé operace)

3. Lokální paměti počítače Cray 2 a jeho upravená registrová sada

Sada registrů popsaná v předchozí kapitole i jejich rozmístění v jednotlivých funkčních modulech sice bylo plně dostačující v dobách počítače Cray-1, ale pro nově zkonstruovaný superpočítač Cray-2 bylo nutné provést několik zásadních úprav souvisejících především s tím, že v Crayi-2 byly instalovány čtyři relativně samostatně pracující procesorové jednotky. Z tohoto důvodu byly dvě sady registrů, konkrétně registry spadající do kategorií B a T (tj. všechny výše zmíněné „záložní“ registry), nahrazeny lokální pamětí o kapacitě 16 kiloslov (slovo mělo šířku 64 bitů), přičemž při konstrukci této paměti byly využity ty nejrychlejší v dané době dostupné paměťové součástky, aby nebyly procesorové jednotky zdržovány pomalejším přístupem k paměti. Superpočítače Cray 2 totiž neměly žádnou obdobu automaticky spravované vyrovnávací paměti, resp. to, co dnes nazýváme vyrovnávacími paměťmi (cache), je obdobou lokálních pamětí u počítače Cray 2, ovšem s tím rozdílem, že přesuny dat mezi hlavní pamětí a lokálními paměťmi byly prováděny přes pracovní registry.

Obrázek 4: Architektura superpočítače Cray-2.

Každá procesorová jednotka (background procesor) počítače Cray 2 měla k dispozici následující registry (povšimněte si zejména řádku LM, což není nic jiného než výše zmíněná lokální paměť):

Označení Počet registrů v sadě Bitová šířka Poznámka
A 8 32 bitů registry použité při adresování
S 8 64 bitů sada registrů pro běžné skalární operace
V 8 64×64 bitů vektorové registry; každý registr je ve skutečnosti 64prvkovým vektorem
VM 1 64 bitů vector mask (použito spolu s vektorovými registry pro některé operace)
VL 6 6 bitů vector length (použito spolu s vektorovými registry pro některé operace)
LM 16k 64 bitů lokální paměť přímo přístupná pro výpočty
Semaphore 1 1 bit semafor, který může být sdílený mezi všemi čtyřmi procesorovými jednotkami

Poznámka: mezi hlavní pamětí a pamětí lokální (VM) nebylo možné přímo přenášet data – jediné operace, které umožňovaly čtení a zápis do hlavní paměti, byly operace typu load a store se skalárními registry S nebo s vektorovými registry V. Pokud tedy bylo nutné pracovat s daty uloženými v hlavní paměti, musel se nejdříve provést „blokový přenos“, ideálně s využitím některého z vektorových registrů V, protože ten dokázal v jediném kroku (nikoli však v jediném strojovém taktu) přenést 64×64=4096 bitů, tj. půl kilobajtu dat!

Obrázek 5: Superpočítač Cray-2 – pohled na výpočetní moduly a moduly s operační pamětí.
(zdroj: Cray Research)

4. Synchronizace procesorových jednotek pomocí semaforů

V registrové sadě představené v předchozí kapitole se mj. nachází dva registry, které se u původního Craye 1 nevyskytovaly, ovšem u Craye 2 plní poměrně důležité funkce. Jedná se o jednobitový semafor a o 64bitový registr VM (vector mask), s jehož pomocí lze nahradit některé typy programových smyček s podmínkou za sadu „vektorových“ operací (dnes se spíše mluví o operacích SIMD – single instruction, multiple data). Nejprve si popišme funkci semaforu. Tento jednobitový registr může být sdílený mezi všemi čtyřmi procesorovými jednotkami (background processors) a slouží především pro jejich vzájemnou synchronizaci; ostatně název „semafor“ je v informatice používán právě v kontextu synchronizace mezi více paralelně běžícími procesy či vlákny.

Jednobitových semaforů bylo v superpočítači Cray-2 implementováno celkem osm, ovšem každý background procesor měl v daném okamžiku přístup pouze k jednomu z těchto semaforů. Přiřazení semaforů jednotlivým background procesorům prováděl foreground procesor, což například umožnilo, aby se první a druhý background procesor vzájemně synchronizovaly s využitím semaforu číslo 1 a třetí background procesor nezávisle na tom synchronizoval svoji činnost s procesorem čtvrtým s využitím semaforu číslo 2. Indexy semaforů přiřazených background procesorům byly uloženy ve status registru dostupného pouze s využitím instrukcí z instrukční sady foreground procesoru. Pro vlastní synchronizaci byly v instrukční sadě background procesorů superpočítače Cray 2 vyhrazeny pouhé čtyři instrukce, které jsou vypsány v následující tabulce. Z této tabulky mj. plyne, že například operaci čekání na nastavení či naopak vynulování semaforu je možné implementovat pomocí jednoduché programové smyčky (samozřejmě je důležité, aby operace skoku a současně nastavení či vynulování semaforu byla atomická, což musí zajistit obvodové řešení procesorových jednotek):

Instrukce Popis
CSM vynulování semaforu, tj. nastavení jeho bitu na logickou nulu
SSM nastavení semaforu na logickou jedničku
JCS xxx pokud je semafor nastaven na logickou nulu, provede se skok na adresu xxx a současně je semafor nastaven na jedničku
JSS xxx pokud je semafor nastaven na logickou jedničku, provede se skok, jinak se nastaví na jedničku (nejde o opak předchozí instrukce)

Obrázek 6: Schéma vzájemného propojení background procesorů s foreground procesorem a hlavní pamětí (žlutý obdélník nalevo). K hlavní paměti je připojen i modul pro načítání instrukcí a jejich rozdělování do jednotlivých instrukčních bufferů (přesněji řečeno front), odkud jsou již instrukce vybírány a prováděny samotnými background procesory.
(zdroj: Cray Research; kvalita obrázku je kvůli nízkému rozlišení při skenování a použití JPEG komprimace poněkud nízká)

5. Základní operace s registrem VM

Dalším registrem, který je v jednotlivých procesorových jednotkách počítače Cray 2 k dispozici, je registr nazvaný VM, což je zkratka sousloví „vector mask“. Název tohoto registru skutečně odpovídá jeho funkci, protože s ním lze provádět několik operací, které „maskují“ jednotlivé numerické hodnoty uložené v některém z vektorových registrů Vk (k=0 až 7). Zdánlivě nadbytečná funkce tohoto registru je však ve svém důsledku velmi užitečná, protože umožňuje nahradit některé typy programových smyček (pracujících s jednorozměrnými nebo dvourozměrnými poli), v nichž se vyskytuje podmínka, za několik jednoduchých a především velmi rychlých operací prováděných nad celým vektorem či vektory uloženými v některém registru Vk. Bitová šířka registru VM je rovna 64 bitům, takže každý jeho bit odpovídá jednomu prvku vektoru, jenž je uložený v registrech V. Obsah tohoto registru je možné přenést z nebo do některého skalárního registru Si (i=0 až 7), jejichž bitová šířka je shodná s šířkou registru VM:

Instrukce Popis instrukce
VM ← Si přenesení obsahu skalárního registru Si do registru VM
Si ← VM opak předchozí instrukce: přenesení obsahu VM do registru Si

(jak jste si zajisté povšimli, jsou mnemonické kódy instrukcí poněkud neobvyklé, ale možná přehlednější, než kódy využívající pouze alfanumerické znaky). Mnohem důležitější a taktéž zajímavější jsou však instrukce, které naplňují registr VM na základě aktuálních hodnot prvků uložených v některém vektorovém registru Vk (k=0 až 7). Tyto instrukce, které každý bit registru VM nastavují podle hodnoty v příslušném prvku vybraného vektorového registru Vk, jsou vypsány v následující tabulce:

Instrukce Popis instrukce
VM ←  Vk,Z nastavení těch bitů registru VM na jedničku v případě, že korespondující prvek Vk je nulový
VM ←  Vk,N nastavení těch bitů registru VM na jedničku v případě, že korespondující prvek Vk je nenulový
VM ←  Vk,P dtto pro prvky Vk větší nebo rovny nule (bit znaménka prvky je nulový)
VM ←  Vk,M dtto pro záporné prvky Vk (bit znaménka prvku je nastavený na jedničku)

Obrázek 7: Sada registrů dostupných programátorům v každém background procesoru. V horní části je osmice vektorových registrů V doplněná registrem VM (Vector Mask) a VL (Vector Length), pod nimi je osmice skalárních registrů S a nejníže pak adresové registry A. Povšimněte si, že obsah adresových registrů není možné načítat ani ukládat z/do operační paměti – pro tuto činnost je nutné použít registry vektorové nebo skalární. Naopak pro přenos dat mezi registry a lokální pamětí (červený obdélník) lze použít všechny registry, včetně registrů speciálních.
(zdroj: Cray Research; kvalita obrázku je kvůli nízkému rozlišení při skenování a použití JPEG komprimace poněkud nízká)

6. Přiřazení hodnoty do vektorového registru s využitím masky

V případě, že jsou všechny bity maskovacího registru VM správně nastaveny pomocí některé z instrukcí zmíněných v předcházející kapitole, lze s využitím tohoto registru provádět následující operace, v nichž se již využívá efektu „maskování“:

Instrukce Popis instrukce
Vi ←  Sj!Vk&VM kombinace prvků vektorového registru Vk se skalárním registrem Sj s uložením výsledku do vektorového registru Vi
Vi ←  Vj!Vk&VM kombinace prvků vektorového registru Vj s registrem Vk s uložením výsledku do vektorového registru Vi

První instrukce pracuje následujícím způsobem: pokud je bit n registru VM (n=0 až 63) nastavený na logickou jedničku, je do n-tého prvku vektorového registru Vi vložena hodnota skalárního registru Sj. Ovšem v případě, že je bit n registru VM nastavený na logickou nulu, je do n-tého prvku vektorového registru Vi zkopírován n-tý prvek z vektorového registru Vk. Obdobným způsobem pracuje i druhá instrukce: pokud je bit n registru VM jedničkový, provede se přiřazení Vi(n)=Vj(n), jinak přiřazení Vi(n)=Vk(n). Obě operace jsou samozřejmě provedeny pro všechna n=0 až 63, navíc je vyhodnocení jednotlivých bitů masky a přenosy prováděno paralelně pro všechny prvky vektorových registrů. Vzájemnou kombinací těchto dvou instrukcí a instrukcí popsaných v předchozí kapitole lze implementovat velkou část programových smyček, v jejichž těle se vyskytuje jeden neúplný příkaz IF-THEN, jeden úplný příkaz IF-THEN-ELSE a v některých (nikoli však všech) případech i vložené příkazy IF.

Obrázek 8: Detailní pohled na funkční moduly superpočítače Cray-2 ponořené do chladicí kapaliny.
(zdroj: Cray Research)

7. Malý úkol pro čtenáře

V této kapitole se může pozorný čtenář pokusit o simulaci optimalizujícího překladače určeného pro superpočítač Cray-2. Následující příklady, v nichž jsou použity programové smyčky a jednorozměrná pole, lze přeložit takovým způsobem, že se smyčky nahradí některou vektorovou operací nebo několika vektorovými operacemi. Pro jednoduchost předpokládejme, že všechna použitá pole mají maximální velikost 64 prvků, aby je bylo možné uložit do vektorových registrů. Pusťme se tedy do řešení. Jakým způsobem by bylo možné přeložit následující programovou smyčku napsanou v pseudokódu (předpokládejme, že umíme naplnit libovolný skalární registr konstantou pomocí instrukce Si<n)?

for i = 0 to 63
    a[i] = 42
end

I tento kód lze optimalizovat a nahradit pouhou sekvencí instrukcí bez programové smyčky:

for i = 0 to 63
    if a[i] == 0 then
        b[i] = c[i]
    else
        b[i] = 42
end

Popř. jak by bylo možné přeložit následující programovou smyčku? (poznámka: Cray 2 obsahuje instrukci Vj-Vk, která odečte všechny prvky vektoru Vk od odpovídajících prvků vektoru Vj, což se vám může při řešení hodit):

UX DAy - tip 2

for i = 0 to 7
    if a[i] > b[i] then
        c[i] = a[i]
    else
        c[i] = b[i]
end
// nyní bude pole "c" obsahovat ve svých prvcích
// vždy větší korespondující prvek z pole "a" a "b"

Obrázek 9: Některé typy programových smyček optimalizovaných překladačem FORTRANu 77 pro počítače Cray-2.
(zdroj: materiály firmy Cray Research)

8. Další operace s vektory

Kromě použití registru VM lze s vektory, přesněji řečeno s numerickými hodnotami uloženými do některého z vektorových registrů Vi, provádět i mnoho dalších aritmetických operací. V následující tabulce jsou vypsány některé instrukce, které tyto operace implementují. Povšimněte si, že tyto instrukce lze rozdělit do několika kategorií: operace prováděné se skalárem a vektorem, operace prováděné mezi dvojicí vektorů, konverze dat a načítání či ukládání dat do hlavní paměti popř. do paměti lokální:

Instrukce Popis instrukce
Vi<-Sj&Vk bitová operace AND (bit po bitu)
Vi<-Vj&Vk dtto ale pro dvojici vektorů
Vi<-Sj\Vk bitová operace XOR (bit po bitu)
Vi<-Vj\Vk dtto ale pro dvojici vektorů
Vi<-Sj!Vk bitová operace XOR (bit po bitu)
Vi<-Vj!Vk dtto ale pro dvojici vektorů
Vi<-Vj<Ak bitový posun doleva o Ak bitů
Vi<-Vj>Ak bitový posun doprava o Ak bitů
   
Vi<-Sj+Vk přičtení skaláru ke každému prvku vektoru
Vi<-Vj+Vk součet dvou vektorů (celá čísla)
Vi<-Sj+FVk přičtení skaláru ke každému prvku vektoru
Vi<-Vj+FVk součet dvou vektorů (FP čísla)
Vi<-Sj-Vk odečtení prvku vektoru od skaláru
Vi<-Vj-Vk rozdíl dvou vektorů (celá čísla)
Vi<-Sj-FVk odečtení prvku vektoru od skaláru
Vi<-Vj-FVk rozdíl dvou vektorů (FP čísla)
   
Vi<-Sj*FVk násobení vektoru skalárem
Vi<-Vj*FVk násobení odpovídajících prvků vektorů
Vi<-Vj*IVk jeden krok výpočtu převrácené hodnoty (2-Vj*Vk)
Vi<-Vj*QSk jeden krok výpočtu odmocniny (3-Vj*Vk)/2
   
Vi<-FIX,Vk konverze z FP na celá čísla (celého vektoru
Vi<-FLT,Vk konverze celých čísel na FP (celý vektor)
   
Vi<-(Aj,Ak) načtení vektoru z globální paměti od adresy Aj, v Ak je krok mezi sousedními prvky (vhodné například pro načítání sloupců matice)
(Aj,Ak)<- Vi uložení vektoru do globální paměti od adresy Aj
Vi<-(Ak,Vj) načtení vektoru z globální paměti od adresy Aj, ve Vj jsou offsety prvků
(Ak,Vj)<Vi dtto, ale uložení do paměti
Vi<-[Ak] načtení vektoru z lokální paměti od adresy Ak
[Ak]<-Vi uložení vektoru do lokální paměti od adresy Ak

9. Odkazy na Internetu

  1. Cray History
    http://www.cra­y.com/About/His­tory.aspx?404;http:­//www.cray.com:80/a­bout_cray/his­tory.html
  2. Cray Historical Timeline
    http://www.cra­y.com/Assets/PDF/a­bout/CrayTime­line.pdf
  3. Company: Cray Research, Inc. (Computer History)
    http://www.com­puterhistory.or­g/brochures/com­panies.php?al­pha=a-c&company=com-42b9d5d68b216
  4. Cray Wiki
    http://www.cra­ywiki.com/index­.php?title=Ma­in_Page
  5. Cray (Wikipedia)
    http://en.wiki­pedia.org/wiki/Cray
  6. Cray-1 (Cray Wiki)
    http://www.cra­ywiki.com/index­.php?title=Cra­y_1S
  7. Cray-1 (Wikipedia)
    http://en.wiki­pedia.org/wiki/Cray-1
  8. Cray X-MP (Wikipedia)
    http://en.wiki­pedia.org/wiki/Cra­y_X-MP
  9. Cray-2 (Wikipedia)
    http://en.wiki­pedia.org/wiki/Cray-2
  10. What Limits Forecast Accuracy?
    http://weather­.mailasail.com/Fran­ks-Weather/Forecast-Accuracy-Limitations
  11. Remembering the Cray-1
    http://www.the­register.co.uk/2008/01/­05/tob_cray1/
  12. Cray Supercomputer FAQ and other documents
    http://www.spi­kynorman.dsl.pi­pex.com/CrayW­WWStuff/index­.html
  13. Cray Research and Cray computers FAQ Part 1
    http://www.spi­kynorman.dsl.pi­pex.com/CrayW­WWStuff/Cfaqp1­.html#TOC
  14. Cray Research and Cray computers FAQ Part 2
    http://www.spi­kynorman.dsl.pi­pex.com/CrayW­WWStuff/Cfaqp2­.html#TOC1
  15. Cray Research and Cray computers FAQ Part 3
    http://www.spi­kynorman.dsl.pi­pex.com/CrayW­WWStuff/Cfaqp3­.html#TOC1
  16. Cray Research and Cray computers FAQ Part 4
    http://www.spi­kynorman.dsl.pi­pex.com/CrayW­WWStuff/Cfaqp4­.html#TOC1
  17. Cray Research and Cray computers FAQ Part 5
    http://www.spi­kynorman.dsl.pi­pex.com/CrayW­WWStuff/Cfaqp5­.html#TOC1
  18. Seymour Cray
    http://www.cra­ywiki.com/index­.php?title=Se­ymour_Cray
  19. Seymour Cray Biography
    http://www.cra­y.com/Assets/PDF/a­bout/SeymourCra­y.pdf
  20. Fluorinert
    http://soluti­ons.3m.com/wps/por­tal/3M/en_US/e­lectronics/ho­me/productsan­dservices/pro­ducts/chemical­s/ElectronicLi­quids/?WT.mc_id=ke­ymatch
  21. Fluorinert
    http://en.wiki­pedia.org/wiki/Flu­orinert
  22. Historic Computer Images
    http://ftp.ar­l.army.mil/ftp/his­toric-computers/
  23. Cray-2 logic module
    http://bobody­ne.com/web-docs/robots/cray2/
  24. The making of a CRAY-3
    http://www.cis­l.ucar.edu/doc­s/SCD_Newslet­ter/News_summer93/04e­.cray3.html
  25. Computer Speed Claims 1980 to 1996
    http://homepa­ge.virgin.net/ro­y.longbottom/mip­s.htm
  26. Speed of Intel 8087 co-processor in FLOPS ($100)
    http://answer­s.google.com/an­swers/threadvi­ew/id/542435.html
  27. Million instructions per second
    http://en.wiki­pedia.org/wiki/Mflops
  28. Million instructions per second
    http://en.wiki­pedia.org/wiki/Mi­llion_instruc­tions_per_secon­d#Million_instruc­tions_per_second
  29. Rosetta Code – Category:Fortran
    http://rosetta­code.org/wiki/For­tran
  30. IBM 36-bit computers
    http://www.36bit­.org/ibm/
  31. Symbolics 36-bit computers
    http://www.36bit­.org/symbolic­s/
  32. IBM System 360/370 Compiler and Historical Documentation
    http://www.edel­web.fr/Simula/
  33. Who Was Who in IBM's Programming Research? Early FORTRAN Days
    http://www.tra­iling-edge.com/~bob­bemer/PRORES.HTM
  34. Emitter-coupled logic
    http://en.wiki­pedia.org/wiki/E­mitter-coupled_logic
  35. ECL – Emitter Coupled Logic
    http://ppd.fnal­.gov/elec/ecl/e­cl.html
  36. Cray's Mark Remains Speed With Simplicity
    http://www.mbbnet­.umn.edu/hoff/hof­f_sc.html
  37. Control Data Corporation (CDC) 6600: 1966–1977
    http://www.cis­l.ucar.edu/com­puters/gallery/cdc/6600­.jsp
  38. Control Data Corporation (CDC) 7600: 1971–1983
    http://www.cis­l.ucar.edu/com­puters/gallery/cdc/7600­.jsp

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