# Cray-1

Il Cray-1 è un supercomputer sviluppato nel 1976 da una squadra di progettisti guidati da Seymour Cray per la Cray Research. Il primo esemplare venne installato al Los Alamos National Laboratory ed era destinato a divenire uno dei più famosi e meglio riusciti supercomputer della storia.

## Storia

All'inizio degli anni settanta Seymour Cray era impegnato per la Control Data Corporation su una nuova macchina chiamata CDC 8600, successore logico del CDC 6600 e CDC 7600. L'8600 era fondamentalmente costituito da quattro 7600 inseriti in un singolo involucro, con una speciale modalità di funzionamento supplementare che permetteva agli stessi di operare in modo "lock-step" in maniera simile al parallelismo SIMD.
Jim Thornton, inizialmente collega di Cray nei primi lavori, preparò le basi di progetto più radicale conosciuto come CDC STAR-100. A differenza dell'approccio a forza bruta dell'8600, orientato alle performance estreme, lo STAR seguiva una strada completamente differente, con un processore principale meno potente di quello del 7600 ma dotato tuttavia di hardware aggiuntivo che velocizzava alcune operazioni particolarmente comuni nei supercomputer.
Nel 1972 l'8600 era giunto alla fine del suo percorso: la macchina era incredibilmente complessa al punto da presentare seri problemi di operatività. Persino un singolo componente difettoso era sufficiente a mandare fuori esercizio la macchina. Cray discusse con William Norris al proposito, il Control Data e CEO della società, affermando che si era resa necessaria una riprogettazione completa. Tuttavia in quel periodo la società stava attraversando una crisi finanziaria e, con lo stesso STAR in fase di sviluppo, Norris non poteva disporre di denaro da investire.
Cray lasciò la società e ne avviò una nuova con sede poco distante dai laboratori CDC, nelle immediate vicinanze di un terreno da lui stesso acquistato a Chippewa Falls (Wisconsin). Cray e un gruppo di ex dipendenti della CDC iniziarono a esplorare nuove soluzioni; inizialmente l'idea di realizzare un supercomputer sembrava improponibile poiché già la CDC non aveva avuto abbastanza denaro per realizzare il progetto e tanto meno avrebbe potuto fare una piccola compagnia appena nata e praticamente senza finanziamenti. Ma il CTO della società stabilì alcuni contatti con agenti di Wall Street e trovò investitori disposti a finanziare la realizzazione di un nuovo supercomputer. Alla società di Cray mancava quindi solamente un nuovo progetto.
Nel 1975 venne annunciato il Cray-1. L'eccitazione intorno alla nuova macchina fu tale da scatenare una guerra tra i centri LLNL e Los Alamos per chi dovesse aggiudicarsi il primo esemplare. Los Alamos vinse la battaglia, aggiudicandosi la macchina con numero di serie 001 del 1976, per un periodo di prova di sei mesi. Il National Center for Atmospheric Research (NCAR) divenne il primo cliente ufficiale della Cray Research nel luglio del 1977 con un versamento di 8,86 milioni di dollari (7,9 milioni di dollari più 1 milione per i dischi). La stessa macchina venne dismessa soltanto nel gennaio del 1989. La compagnia si aspettava inizialmente di vendere una dozzina di macchine; di fatto vendette più di ottanta macchine a un prezzo compreso tra i 5 milioni e gli 8 milioni di dollari. La macchina rese Cray una celebrità nel suo ambiente e la sua compagnia un successo durato fino all'inizio degli anni novanta quando il mercato dei supercomputer è crollato.
Al Cray-1 da 250 MegaFLOPS seguì nel 1982 il Cray X-MP, una macchina da 800 MegaFLOPS nonché prima macchina multiprocessore della società. Nel 1985 venne presentato il Cray-2, una macchina molto avanzata in grado di sviluppare 1,9 GigaFLOPS di picco. Questo computer ebbe però un limitato successo commerciale per via di problemi ad ottenere prestazioni elevate nelle applicazioni in problemi reali. Nel 1988 venne quindi presentato il Cray Y-MP, un nuovo modello basato su un disegno molto conservativo, evoluzione dei Cray-1 e X-MP dai quali prese il nome.

## Premessa

Molte applicazioni scientifiche sono caratterizzate dalla lettura di un ampio insieme di dati, l'elaborazione e la scrittura dei dati trasformati. Spesso le operazioni sono di carattere ripetitivo, applicate allo stesso modo su ogni singolo dato dell'insieme. Per esempio un programma potrebbe leggere un milione di numeri e sommare ad ognuno il valore 5. In computer tradizionali ciò si traduce in un ciclo di lettura di ognuno del milione di numeri e di successiva addizione con istruzioni del tipo a = add b, c . Il computer risolve internamente le istruzioni in vari passi: legge l'istruzione dalla memoria e la decodifica, recupera i dati necessari (in questo caso b e c), esegue l'operazione vera e propria e salva il risultato, per ognuno del milione di cicli.

### Macchine vettoriali

Nel sistema STAR, nuove istruzioni permettevano di eseguire i cicli in modo molto efficiente. In sostanza si poteva specificare alla macchina quale insieme di dati andassero trattati con la stessa istruzione, con una singola istruzione del tipo a(..1000000) = addv b(1..1000000), c(1..1000000). Sebbene a prima vista i vantaggi possano sembrare limitati, nel caso in esame la macchina carica e decodifica soltanto un'istruzione invece di un milione, eliminando di fatto il tempo necessario a tali operazioni stimato intorno a 1/4 del tempo totale di elaborazione. Quanto più l'insieme di dati da trattare è ampio tanto maggiore è l'aumento di prestazioni del sistema.
In realtà l'aumento di prestazioni non è così scontato. Di fatto le CPU sono costituite da un certo numero di parti ognuna dedicate ad un singolo compito, per esempio eseguire un'addizione o recuperare un dato in memoria ("fetch"). Tradizionalmente, l'esecuzione di un'istruzione determina l'attivazione in sequenza di singole parti della CPU (mentre le rimanenti restano inattive) finché non viene prodotto il risultato finale. L'introduzione di una pipeline delle istruzioni rivoluziona il processo, consentendo alla CPU di recuperare in anticipo l'istruzione successiva a quella "in corso". Pensando alla CPU come ad una catena di montaggio, il tempo complessivo di esecuzione della singola istruzione non cambia ma al termine della stessa la successiva istruzione è già parzialmente eseguita.
I processori vettoriali fanno uso di tale tecnica con un trucco aggiuntivo: poiché la struttura dei dati è nota (essenzialmente un insieme di numeri situati linearmente in memoria), la pipeline può essere ottimizzata per migliorare le prestazioni di fetch. All'arrivo di un'istruzione vettoriale, hardware dedicato predispone l'accesso alla memoria per la lettura di valori multipli nel minor tempo possibile.
Il CDC STAR utilizzava un'architettura oggi nota come di tipo "memoria-memoria", con riferimento al modo di reperire i dati e alla predisposizione della pipeline per la lettura e la scrittura dei dati direttamente in memoria. Tale architettura permetteva di utilizzare vettori di qualsiasi lunghezza o profondità ("stride"), molto flessibile e veloce con le istruzioni vettoriali. La pipeline doveva, però, essere molto profonda (più passi per ogni istruzione, più istruzioni eseguibili in contemporanea), per poter proseguire l'elaborazione mentre il sistema attendeva i dati dalla memoria principale, con un alto costo in termini di tempo nel passaggio da istruzioni vettoriali a normali istruzioni scalari. Il sistema era inoltre caratterizzato da prestazioni scarse sulle istruzioni scalari, penalizzando le prestazioni generali nelle applicazioni reali. Ciò era prevedibile tenendo conto della legge di Amdahl.

### L'approccio di Cray

Cray analizzò il fallimento dello STAR e fu in grado di trarne utili insegnamenti. Cray decise che il proprio sistema dovesse essere molto veloce anche nell'elaborazione scalare in modo da poter compensare la commutazione tra il funzionamento vettoriale e quello scalare. Inoltre Cray notò che l'impiego di registri poteva migliorare drasticamente le prestazioni del sistema nella maggior parte dei casi.
Così come le precedenti macchine avevano ignorato il fatto che la maggior parte delle operazioni vengono eseguite in serie su molti dati dello stesso tipo, lo STAR ignorava la possibilità che si potesse elaborare ripetutamente ogni dato. Se per esempio lo STAR avesse dovuto eseguire cinque operazioni su un insieme di dati avrebbe dovuto leggere cinque volte i dati dalla memoria mentre sarebbe stato molto più efficiente leggere i dati temporaneamente conservati in registri interni alla CPU. I registri sono piuttosto costosi in termini di complessità circuitale e potevano essere implementati in numero limitato; pertanto l'architettura di Cray avrebbe avuto meno flessibilità nelle dimensioni dei vettori. Quindi, anziché leggere più volte un vettore di qualsiasi dimensione come avrebbe fatto lo STAR, il progetto della Cray avrebbe letto un sottoinsieme ridotto del vettore alla volta (fino ad esaurirne i dati) su cui eseguire però con maggiore efficienza molteplici operazioni. Cray riteneva che il limitato svantaggio dovuto agli accessi alla memoria (per le "sezioni" di vettore in sequenza) fosse comunque ben ripagato.
Poiché le operazioni vettoriali avrebbero implicato il caricamento di ridotti insiemi di dati nei registri vettoriali ed eseguire su questi ultimi più trasformazioni, si decise di realizzare una pipeline appositamente per le operazioni vettoriali. Per esempio le operazioni di somma e di moltiplicazione avevano un proprio hardware dedicato in modo tale che i risultati di un'operazione potevano essere internamente passati alla successiva, non appena eseguita la rispettiva decodifica nella pipeline principale, in modo da non bloccare il processore durante le operazioni. Cray indicò il concetto come "concatenamento" ("chaining") per consentire ai programmatori di concatenare numerose operazioni ed ottenere performance superiori.

## Descrizione

Il nuovo sistema fu il primo progetto Cray con impiego di circuiti integrati. Sebbene i circuiti integrati fossero disponibili fin dagli anni 60 solo agli inizi degli anni 70 raggiunsero le prestazioni sufficienti per i circuiti ad alta frequenza necessari e nel frattempo si raggiunse un'affidabilità adeguata. I circuiti integrati utilizzati nel progetto di Cray erano soltanto di 4 tipi: una doppia porta NAND ECL, un'altra più lenta doppia NAND (per la distribuzione degli indirizzi), una RAM statica a 16x1 bit ad alta velocità (6 ns) per i registri e infine una RAM statica (50 ns) per la memoria principale. In totale il Cray-1 conteneva circa 200.000 porte logiche.
I circuiti integrati venivano montati su ampi circuiti stampati a cinque strati contenenti fino a 144 circuiti integrati per scheda. I circuiti vennero montati uno di fronte all'altro per migliorare il raffreddamento e disposti in ventiquattro rack da 28 pollici contenenti 72 slot per schede doppie. Un tipico modulo (una singola unità di elaborazione) richiedeva una o due schede accoppiate. In totale la macchina conteneva 1992 moduli di 113 diversi tipi.
Un problema scoperto durante la fase iniziale di sviluppo era la velocità della macchina, spinta al limite dei tempi dei segnali logici di alcuni circuiti -deliberata caratteristica di progetto-, tale che i segnali non arrivavano in tutti i circuiti in modo corretto. Alcuni componenti ricevevano un segnale troppo in anticipo e quindi troppo debole per permettere una sicura identificazione del livello logico. Il problema venne risolto aggiungendo alcuni leggeri ritardi lungo le linee. I ritardi venivano creati aggiungendo porte logiche che ritardassero il segnale e lo amplificassero oppure aggiungendo piccole capacità alle linee. Si stima che il 40% dei circuiti integrati del sistema servissero per ripulire il segnale o per introdurre dei ritardi.
Come sempre Cray spese molto tempo per mettere a punto il progetto meccanico ed elettrico dei sistema in modo da ottenere un'elevata frequenza di funzionamento. I moduli di elaborazione erano molto vicini ai moduli di alimentazione per ridurre il rumore ed elevare la frequenza di funzionamento. Ogni cavo che collegava un modulo era attorcigliato con una massa in modo da ridurre le interferenze elettromagnetiche, inoltre ogni cavo aveva una lunghezza specifica in modo da evitare riflessione dell'onda elettromagnetica che lo percorreva. Ogni amplificatore era bilanciato in modo da mantenere costante la richiesta di potenza elettrica e quindi ridurre i disturbi dovuti all'alimentazione.
I circuiti ad alte prestazioni generavano una notevole potenza termica che i progettisti del Cray-1 analizzarono con attenzione per ottenere un buon sistema di raffreddamento e un supporto meccanico adeguato. Ogni circuito elettronico veniva appaiato con un secondo disposto frontalmente al primo. Tra il primo e il secondo veniva disposto un foglio di rame per permettere al calore di scorrere agevolmente lungo il foglio e poter essere raffreddato dal freon che scorreva al lato della macchina. Il primo Cray-1 venne ritardato sei mesi per risolvere i problemi legati all'unità di refrigerazione. Il lubrificante che veniva normalmente miscelato con il freon per permettere al compressore di funzionare correttamente fuoriusciva dalle guarnizioni e finiva per sommergere i circuiti elettronici danneggiandoli. Nuove tecniche di saldatura risolsero il problema impedendo al lubrificante di fuoriuscire dai condotti.
Per ottenere il massimo delle prestazioni possibili il telaio della macchina fu progettato con la forma di una grande C. Le parti del sistema più strette con i tempi vennero disposte sulla parte interna della C in modo da ridurre la lunghezza dei collegamenti e quindi i tempi di trasferimenti. Questo insieme alle altre scelte tecniche permise di ridurre il tempo di ciclo a 12,5 ns (80 MHz), non veloce quanto gli 8 ns (125 MHz) previsti per l'8600 ma sufficienti per superare il CDC 7600 e lo STAR. NCAR stimò che la macchina fosse circa 4.5 volte più rapida del CDC7600.
Il Cray-1 era un sistema a 64 bit a differenza del 7600/6600 che erano macchine a 60 bit (anche l'8600 avrebbe dovuto essere a 64 bit). L'indirizzamento era a 24 bit e permetteva al massimo 1 milione di word (16 MB) di memoria principale. La memoria era disposta su 16 banchi, ogni banco con un tempo di ciclo di 50 ns in modo da permettere la lettura di quattro word (4 × 16 bit) per ciclo di clock.
I registri principali consistevano in 8 registri a 64 bit scalari (S) e 8 registri a 24 bit per gli indirizzi (A). In aggiunta erano presenti 64 registri temporanei per memorizzare A e S chiamati T e B ma che non erano visibili dal set di istruzioni. Le unità vettoriali aggiunsero 8 registri vettoriali contenenti ognuno 64 elementi a 64 bit oltre a un registro per la lunghezza del vettore (VL) e uno per la maschera del vettore (VM). Infine il sistema conteneva un clock a 64 bit e quattro registri a 64 bit per il buffer delle istruzioni che erano a 16 bit e quindi contenevano 16 istruzioni. Le memorie erano progettate in modo da poter caricare i registri vettoriali in un ciclo di clock mentre gli accessi ai registri scalari e di indirizzamento richiedevano due cicli di clock. Invece l'intero buffer di istruzioni poteva essere riempito con quattro cicli di clock.
Il sistema era dotato di dodici unità funzionali ma era dotato di un limitato parallelismo. Poteva caricare un'istruzione nell'unità funzionale per ciclo di clock e dato che due unità potevano operare in parallelo il sistema poteva fornire teoricamente 160 MIPS (80 MHz × 2 istruzioni) sebbene nella realtà il sistema sviluppasse circa 135 MegaFLOPS. Tuttavia utilizzando con accortezza le istruzioni vettoriali il sistema poteva ottenere fino a 250 MegaFLOPS.
Il sistema era progettato per operare con ampi insiemi di dati e quindi fu speso molto tempo per realizzare un sistema di I/O efficiente. I primi progetti Cray al CDC includevano due computer separati per gestire le operazioni di ingresso uscita. Nel Cray-1 questo non fu necessario dato che la macchina includeva 6 controller di canale in grado di accedere alla memoria ogni quattro cicli di clock. Ogni controller leggeva 16 bit di dati con tre bit di controllo e uno per la correzione degli errori. Il sistema carica una parola in 100 ns e ogni secondo poteva prelevare 500.000 parole in totale.
Il primo modello Cray-1A pesava 5,5 tonnellate e includeva il sistema di refrigerazione basato sul freon. Configurato con un milione di word di memoria principale, la macchina consumava 115 kW di potenza. Un Data General SuperNova S/200 venne utilizzato come terminale per gestire il sistema ma in seguito venne sostituito dall'Eclipse.
Il successivo Cray-1S era una versione leggermente più veloce (12 ns di tempo di clock) del primo Cray e poteva venir configurato con 1, 2 o 4 milioni di parole a 64 bit. Le macchine della Data General vennero sostituite da un sistema progettato internamente con architettura a 16 bit e con una potenza di 80 MIPS. Il sistema di I/O venne spostato su una macchina apposita collegata al sistema tramite un canale a 6 MB/s e un secondo controller da 100 MB/s tramite collegamento in fibra ottica. La separazione dei sistema I/O permise di realizzare molte configurazioni del Cray-1. La più economica era l'S/500 senza sistema di I/O e con 0.5 Milioni di parole di memoria primaria. La più costosa era l'S/400 con 4 milioni di parole di memoria principale e 4 sistemi di I/O.
Il Cray-1S venne rimpiazzato dal Cray-1M dove la M indicava l'uso molto esteso della tecnologia MOS per la memoria principale e per il sistema di I/O. Il sistema 1M era disponibile in tre versioni, l'M/1200 con un milione di parole come memoria principale, l'M/2200 e l'M/4200 con 2 o 4 milioni di parole come memoria principale. Tutti i sistemi includevano due, tre o quattro sistemi di I/O e un secondo canale ad alta velocità opzionale. Gli utenti potevano richiedere un disco a stato solido da 8 a 32 milioni di parole basate su MOS-RAM.

## Software

Nel 1978, il primo pacchetto software standard per il Cray-1 venne prodotto. Il pacchetto era formato da:
* Cray Operating System (COS) (le ultime versioni utilizzarono l'UNICOS, il sistema operativo tipo UNIX di Cray),
* Cray Assembler Language (CAL), e
* Cray FORTRAN (CFT), il primo compilatore Fortran che automaticamente vettorializza i programmi.