# CDC 6600

Il CDC 6600 fu il primo supercomputer costruito dalla Control Data Corporation nel 1963. In generale viene considerato il primo supercomputer con un ampio successo commerciale. Divenne il più veloce supercomputer della sua era essendo tre volte più rapido del precedente IBM 7030 Stretch. Rimase il più potente computer del pianeta tra il 1964 e il 1969 quando venne sorpassato dal successore CDC 7600. Fu il primo sistema a implementare lo scoreboarding.
L'organizzazione del CDC 6600 venne utilizzata da CDC per lo sviluppo del più semplice (e lento) CDC 6400 e in seguito per lo sviluppo di un sistema basato su due processori CDC 6400 che divenne il CDC 6500. Queste macchine sono compatibili a livello di codice con il 6600 ma per via del progetto più semplice e sequenziale sono sistemi più lenti. Il successore CDC 7600 inizialmente doveva essere compatibile con il codice del 6600 ma in seguito si abbandono la compatibilità per ottenere prestazioni migliori.

## Storia

I primi progetti CDC erano basati sull'architettura sviluppata da Seymour Cray all'ERA che Cray aveva migliorato per la CDC. Dopo lo sviluppo della macchina sperimentale Little Character venne messa in commercio la macchina CDC 1604 uno dei primi computer commerciali basati su transistor e una delle più veloci macchine del mercato. I dirigenti pianificarono lo sviluppo di una nuova serie di macchine indirizzate al mercato commerciale e quindi con delle istruzioni appositamente progettare per i compiti commerciali. Cray non era interessato a questo progetto, lui voleva realizzare una macchina 50 volte più rapida del 1604. Cray sotto la richiesta dei dirigenti completò un dettagliato piano quinquennale che prevedeva la realizzazione del più veloce computer del pianeta.
Con il suo team di sviluppo si spostò nel nuovo laboratorio vicino alla sede della CDC e iniziò a sperimentare delle versioni ad alta velocità dei transistor basati sul germanio che Cray aveva utilizzato per il 1604. Dopo molti esperimenti con il germanio concluse che quel semiconduttore non avrebbe permesso di realizzare dei transistor molto veloci in modo semplice. In effetti le macchine desiderate della dirigenza e sviluppate per compiti commerciali, cioè la serie CDC 3000, si erano spinte fino al limite della loro tecnologia. Cray decise di puntare sui nuovi transistor basati sul silicio sviluppati dalla Fairchild Semiconductor che erano stati presentati da poco e fornivano frequenze di funzionamento molto elevate.
Nello stesso periodo la CDC stava diventando una grande società. Cray diventava sempre più insofferente alle continue interferenze dei dirigenti che a suo dire creavano inutili complicazioni e avevano delle richieste inutili. Nel 1962 il CDC 3600 era in produzione e i rapporti tra Cray e la dirigenza erano diventati molto tesi. Cray parlò con il CEO William Norris e gli disse che: o gli lasciava creare un laboratorio lontano della sede principale oppure lui avrebbe abbandonato la società. Norrir conosceva l'importanza di Cray nella progettazione dei sistemi e acconsentì alla realizzazione di un altro laboratorio.
Dopo una breve ricerca Cray decise di creare il laboratorio nella sua città natale, Chippewa Falls dove acquistò un ampio appezzamento di terreno. Nonostante la realizzazione del laboratorio abbia inizialmente rallentato lo sviluppo dei progetti, una volta che il laboratorio fu a regime i progetti progredirono rapidamente. Nello stesso periodo i nuovi transistor stavano raggiungendo la maturità necessaria per delle applicazioni complesse come quelle ideate da Cray. Cray lavorò con Jim Thornton un progettista molto capace alla realizzazione dell'architettura della macchina.
Più di cento CDC 6600 vennero vendute durante la vita operativa della macchina. Molti laboratori di ricerche nucleari, università e multinazionali acquistarono la macchina. Dopo la realizzazione del 6600 Cray iniziò a sviluppare il successore 7600, l'obiettivo del nuovo modello era di sviluppare una potenza di calcolo di 10 volte superiore a quella del 6600. I successivi prodotti CDC i CDC Cyber 70 e 170 erano molto simili al CDC 6600.
Nel 1966 L. J. Lander and T. R. Parkin usando un CDC 6600 trovarono un controesempio alla congettura di Eulero per k=5 : (27$^5$ + 84$^5$ + 110$^5$ + 133$^5$ = 144$^{5)}$ .

## Descrizione

Una tipica macchina utilizzava una singola CPU per gestire l'intero sistema. Un tipico programma inizialmente caricava i dati nella memoria (spesso utilizzando le librerie ottimizzate), processava i dati a poi li salvava in memoria: tutto ciò implicava l'utilizzo di CPU complesse, estese e dunque soggette a forti penalità prestazionali per via delle latenze di comunicazione. Difatti i progettisti devono garantire che i segnali attraversino le unità funzionali prima della successiva elaborazione e quindi la frequenza massima è limitata.
Cray seguì un altro approccio. In quel periodo una CPU era molto più lenta della memoria, per esempio se la moltiplicazione tra due numeri richiedeva quindici cicli di clock per l'esecuzione l'accesso alla memoria richiedeva solo uno o due cicli e quindi era considerata trascurabile. Nel 6600 il tempo di accesso e il tempo di elaborazione era simile.
Invece di delegare tutte le funzioni alla CPU nel 6600 questa gestiva solo le funzioni aritmetiche e logiche. Questo rendeva la CPU molto piccola e quindi questa poteva operare a frequenze molto elevate. Il nuovo progetto combinato con i veloci transistor da 100 ns (10 MHz) permise di realizzare un processore dieci volte più rapido di quello prodotto dalla concorrenza. Inoltre il processore era anche molto efficiente, per esempio poteva eseguire una moltiplicazione in solo 10 cicli di clock.
Ovviamente essendo semplice il processore non poteva svolgere tutte le operazioni necessarie al normale funzionamento di un computer. Le istruzioni di caricamento e salvataggio dei dati in memorie e le operazioni di I/O vennero rimosse dal processore. Cray affido queste mansioni a dei processori esterni che chiamò PP o peripheral processing units. Per supportare il processore dieci PP lavoravano in parallelo, questa architettura migliorava significativamente le prestazioni del sistema.
Ovviamente questa architettura era anche molto più costosa di un'architettura classica. Per mantenere il costo contenuto e le prestazioni adeguate i PP vennero realizzati per essere semplici. I PP vennero basati sui processori dei CDC 160A, questi processori erano a 12 bit ed erano molto lenti rispetto alla CPU e per questo Cray ne utilizzò 10 che venivano collegati alla memoria e alla CPU da dei canali dedicati ad alta velocità.
Le macchine funzionava in una modalità particolare. In ogni istante di tempo una PP controllava la CPU e le assegnava un compito da eseguire. La scrittura dei programmi era difficoltosa dato che bisognava sincronizzare correttamente l'esecuzione dei dati con il loro caricamento. La CPU era molto più veloce della memoria e quindi i programmi dovevano sfruttare i tempi morti di elaborazione per caricare i dati. La CPU avrebbe dovuto attendere 10 cicli di clock per caricare i dati dalla memoria ma utilizzando le 10 PP in parallelo i tempi di accesso si riducevano a un ciclo di clock.
Le 10 PP erano implementate in modo virtuale dato che in realtà in hardware esisteva una sola PP. La CPU accedeva a 10 insiemi di registri che simulavano lo stato dei 10 PP. I processori PP venivano gestiti in modo esclusivo permettendo al processore di accedere al singolo registro di competenza. Più rotazioni delle PP erano necessarie per eseguire un'istruzione completa. Una rotazione completa dei registri richiedeva 1000 nanosecondi e un'istruzione poteva richiedere da 1 a 5 rotazioni dei registri, le rotazioni dei registri simulavano l'accesso alla memoria.
L'architettura base della CPU del 6600 attualmente verrebbe classificata come architettura RISC dato che il processore era dotato di un set limitato di istruzioni e aveva limitate modalità di accesso alla memoria. Allora (e per molti anni a seguire) la filosofia imperante era quella di realizzare CPU in grado di eseguire operazioni molto specializzate e complesse in modo da poter coprire al meglio l'esigenza dei programmatori. Questi processori come già indicato prima erano molto complessi e quindi lenti a differenza della CPU del 6600 che grazie alla sua semplicità era molto veloce.

### Il Central Processor (CP)

Il Central Processor (CP) e la memoria dei 6400, 6500 e 6600 era formata da parole di 60 bit. la ragione di un'architettura a 60 bit era che questa permetteva di utilizzare parole di 2, 3,4,5,10,12 e 15 bit quindi la memoria poteva essere riempita con parole di diversa lunghezza per riempire al meglio la memoria (un componente molto costoso a quell'epoca).
Il Central Processor aveva otto registri di uso generico a 60 bit indicati da X0 a X7, aveva otto registri a 18 bit per gli indirizzi da A0 a A7 e otto registri a 18 bit, da B0 a B7, utilizzati per la gestione degli indici. Dei registri addizionali erano utilizzati per lo scoreboarding e non erano visibili all'esterno del processore. Altri registri (RA e FL) erano utilizzati dal sistema operativo. Il CP non aveva istruzioni per caricare o salvare i dati dato che questo era svolto dai PP. In accordo alla filosofia RISC, il processore non poteva leggere o scrivere dati direttamente dalla memoria al processore ma doveva sempre passare dai registri. La lettura e la scrittura dei dati avveniva tramite registri. L'immissione di un indirizzo nei registri da A1 a A5 produceva la lettura dei dati dalla memoria e la loro immissione nei registri da X1 a X5. L'immissione di indirizzi nei registri A5, A6 e A7 invece produceva la scrittura dei registri X5, X6 e X7 nelle locazioni di memoria indicata. I registri X0 e A0 non erano coinvolti nelle operazioni di lettura e scrittura dei dati. La reale lettura e scrittura dei dati in memoria veniva svolta in modo indipendente dal funzionamento del processore, dato che veniva svolta in modo asincrono, e nelle condizioni ottimali veniva svolta in otto cicli di clock. In un moderno progetto le operazioni di lettura e scrittura della memoria sono svolte da unità load/store interne al processore ma asincrone rispetto alle altre unità interne di elaborazione. Le operazioni in virgola mobile erano il fiore all'occhiello del sistema: il CDC 6600 era in grado di eseguire una moltiplicazione a 60 bit in virgola mobile nello stesso tempo e con la stessa velocità di un salto condizionato.
Il CP del 6600 includeva 10 unità funzionali che operavano in parallelo in modo da eseguire più operazioni in parallelo. Attualmente questa architettura verrebbe definita superscalare, ma a quel tempo era una caratteristica unica. Il sistema eseguiva e decodificava le istruzioni più velocemente di quante ne potesse caricare dalla memoria. Le unità erano:
* unità di esecuzione in virgola mobile (2)
* unità di divisione in virgola mobile
* unità di somma in virgola mobile
* unità di somma
* sommatore (2 unità, migliorano le prestazioni della memoria)
* unita di shift
* unità di logica booleana
* unità di salto
Le istruzioni prima di essere eseguite venivano immesse in un buffer a 8 stadi alimentato dai registri del processore. Le istruzioni lunghe 15 bit venivano raggruppate a blocchi di quattro, il sistema recuperava dalle 32 istruzioni immagazzinate un'istruzione libera da vincoli di esecuzione e la mandava all'unità di esecuzione adeguata. La pipeline veniva svuotata nel caso di salto incondizionato. Nel caso di salto condizionato poteva essere più rapida. Il sistema utilizzava un clock di 10 MHz ed utilizzava un segnale con quattro fasi per sincronizzare le unità che tramite la presenza di 4 istruzioni per ogni accesso alla memoria permetteva al sistema di funzionare occasionalmente come un sistema a 40 MHz. La moltiplicazione in virgola mobile richiedeva 10 cicli di clock mentre la divisione in virgola mobile richiedeva 29 cicli. Tenendo conto degli accessi alla memoria il sistema poteva sviluppare circa 3 MegaFLOPS. Utilizzando i migliori compilatori fortran dell'epoca si potevano ottenere programmi che sviluppassero una potenza di calcolo di circa 0.5 MegaFLOPS.

### Organizzazione della memoria

I programmi a livello utente erano limitati a poter utilizzare solo una porzione di memoria del sistema. Quella porzione di memoria era gestita dal registro RA e dal registro FL'. Quando un programma provava ad accedere alla memoria metteva l'indirizzo nei registro AX e il processore controllava se l'indirizzo era compreso tra 0 e FL-1, se il test era positivo il processore accedeva alla memoria alla locazione RA+AX. Questo procedimento è conosciuto come logical address translation e permette ai programmi di vedere la memoria come un blocco contiguo (con lunghezza FL) senza conoscere il reale indirizzo fisico. Con questa tecnica il sistema operativo poteva spostare i programmi nella memoria fisica senza dover modificare i programmi ma dovendo solamente aggiornare il registro RA. I registri permettevano di evitare accessi illegali alla memoria, se un programma accedeva a una locazione non consentita il processore impediva l'accesso e il sistema operativo terminava il programma. Quando il programma veniva terminato il sistema operativo faceva una copia della memoria su file in modo da facilitare il debug al programmatore. Tuttavia a differenza della memoria virtuale l'intero programma doveva venir caricato in memoria.
La serie CDC 6000 inoltre poteva venir configurata con un sistema Extended Core Storage (ECS). ECS venne prodotto in diverse varianti per poter fornire molte configurazioni di memoria. Questa era economica ma non era molto veloce. Il primo motivo della lentezza dell'ECS era che questa era collegato al sistema tramite due canali a differenza della memoria principale che utilizzava quattro canali e che effettuava trasferimenti con parole molto ampie. La CPU 6000 poteva trasferire direttamente ampi blocchi di memoria tra la sua memoria principale e la memoria ECS. Per i trasferimenti veniva utilizzato l'ampio bus di collegamento e quindi il processo era relativamente rapido. La gestione a blocchi della memoria veniva mantenuto anche nella memoria ECL tramite l'utilizzo dei registri RA/FL. La memoria ECL veniva utilizzata per molti compiti come il contenere ampi insiemi di dati, swap di dati non usati e comunicazione con altri sistemi di calcolo.

### Peripheral Processors (PP)

Per svolgere i campiti di I/O del sistema e per caricare i dati nella CPU Cray progetto dieci processori periferici che vennero basati sui processori del CDC 160A il primo sistema progettato e venduto da Cray per la CDC. Questi processori chiamati Peripheral Processors (PP) inizialmente erano computer completi ma Cray li modificò e adattò per svolgere le funzioni di I/O del 6600 e per eseguire il sistema operativo. Un processore PP era coinvolto nella gestione della macchina e gestiva anche l'elaborazione del processore principale mentre gli altri eseguivano le operazioni di I/O. Quando un programma doveva caricare o salvare dei dati attivava uno dei PP e faceva eseguire il compito al processore periferico. Quando il PP aveva terminato il lavoro avvertiva il processore principale tramite un interrupt.
Ogni PP includeva una memoria di 4096 parole da 12 bit. La memoria era utilizzata per memorizzare i dati in transito mentre l'esecuzione vera e propria del programma era condivisa dai dieci processori. In ogni ciclo di clock un PP eseguiva un accesso alla memoria e poi il passava il controllo al PP successivo. Dato che un accesso alla memoria richiedeva 10 cicli di clock quando il PP riceveva nuovamente l'accesso alla memoria il dato era disponibile al PP. Questa modalità riduceva il costo del sistema e non penalizzava il sistema.

### Set di caratteri

L'unità di elaborazione centrale utilizzava parole di 60 bit mentre i processori periferici utilizzavano parole a 12 bit. La CDC utilizzava il termine byte per riferirsi alle parole da 12 bit, i caratteri erano a 6 bit mentre le istruzioni erano a 15 bit o a 30 bit con uno spazio di indirizzamento da 18 bit, che poteva gestire blocchi di 128.000 parole. La dimensione dei registri limitava la dimensione massima della memoria indirizzabile per programma. Le successive macchine CDC 6000 furono dotate di 256 000 parole o più ma la dimensione del blocco di memoria rimase immutata per compatibilità con i programmi passati. Le istruzioni di salto erano seguire da una NOP per via della pipeline che eseguiva sempre l'istruzione dopo il salto indipendentemente dal risultato del salto.
I caratteri a 6 bit erano utilizzati per immagazzinare 10 caratteri in una sola parola. Questi permettevano di gestire un set di caratteri limitato a soli 64 simboli, un numero sufficiente a contenere comunque le lettere minuscole, maiuscole e i segni di punteggiatura. Il set permetteva di programmare in Fortran o stampare rapporti finanziari. Esistevano due set di caratteri, uno con 64 simboli e uno con soli 63 simboli. Il set con 64 simboli aveva lo svantaggio che due ':' consecutivi venivano interpretati come fine della linea se erano posti alla fine di una parola di 10 caratteri. Una successiva serie di caratteri chiamata 6/12 venne utilizzata dal sistema operativo KRONOS e NOS. Questi permettevano di utilizzare il set completo ASCII sebbene in modo incompatibile con il vecchio set di caratteri.
Dato che non venivano utilizzati bit per specificare gli indirizzi di accesso ma erano specificati gli spiazzamenti di accesso all'interno delle istruzioni si potevano realizzare programmi molto compatti.. Le parole molto ampio inoltre permettevano di raccogliere più istruzioni in una sola parola e quindi di ridurre l'occupazione della memoria, una risorsa molto costosa.
È interessante notare che le ampio parole che contenevano fino a 10 caratteri permettevano di gestire blocchi di parole molto rapidamente. Il, processore processava i dati contemporaneamente in modo molto rapido. Il processore impiegava più tempo a trattare solo alcuni dati nella parola che a trattare tutti i dati contemporaneamente. Attualmente le istruzioni multimediali dei processori utilizzano una tecnica simile.

### Progetto a livello hardware

La macchina è stata costruita in una serie di cabinet con una pompa di calore da 18 pollici. Il raffreddamento era eseguito dal freon che circolando nella macchina e nel gruppo di raffreddamento asportava calore dei processori. Ogni sezione era composta da quattro chassis spessi 8 pollici. Ogni châssis era numerato da 1 a 16 e contenevano i 10 PP, le memorie e i canali di I/O come sono almeno 12. La memoria principale era suddivisa nei vari châssis.
La logica della macchina era racchiusa in moduli da 2.5 pollici spessi circa un pollice. Ogni modulo era collegato (circa 40 pin di collegamento su due file) e 6 pin di collegamento sul lato opposto che venivano utilizzati per il test dei moduli. I moduli erano racchiusi da due fogli di alluminio che servivano per rimuovere il calore in eccesso. Questa struttura a moduli forniva una elevata integrazione circuitale ma era difficile da riparare per via dei fogli di alluminio che racchiudevano i moduli.

## Sistemi operativi e programmazione

Il solo punto dove il sistema CDC 6600 era carente era il sistema operativo.
La macchina inizialmente utilizzava un sistema operativo molto semplice basato sui processi da eseguire e chiamato COS, il Chippewa Operating System, che venne sviluppato molto rapidamente dato che derivava dal sistema operativo utilizzato dai primi CDC 3000. Il COS era sviluppato per svolgere funzioni di test durante lo sviluppo della macchina. Per la versione definitiva della macchina era in sviluppo il SIPROS, SImultaneous PRocessing Operating System, un sistema operativo molto innovativo che la società System Sciences Division di Los Angeles stava sviluppando. Gli acquirenti erano impressionati dalle caratteristiche del SIPROS e molti prenotarono il SIPROS per le loro macchine.
Il SIPROS si tramutò in un enorme fiasco. Gli sviluppatori continuavano a ritardare la data di distribuzione e presto il costo delle penalità che la CDC doveva pagare agli acquirenti superarono i guadagni del sistema operativo. Dopo molti mesi passati con la macchina pronta per la spedizione ma senza sistema operativo il progetto venne annullato. Per fortuna i programmatori di COS avevano continuato lo sviluppo del loro sistema operativo dato che ritenevano gli sviluppatori di Los Angeles non in grado di sviluppare un sistema operativo così innovativo.
Il sistema operativo si divise in due versioni. La prima versione venne realizzata dai laboratori di Sunnyvale (California) e venne chiamato SCOPE (Supervisory Control Of Program Execution), molti acquirenti accettarono i computer con questo sistema operativo. SCOPE 1 era in sostanza una versione di COS con poche modifiche. SCOPE versione 2 includeva nuovi moduli e il supporto del file system. SCOPE versione 3 includeva la gestione di file permanenti, la gestione del El/200 file bach e il supporto dell'INTERCOM, un sistema di time sharing. SCOPE ha sempre mostrato notevole affidabilità e facilità di manutenzione.
La seconda versione di COS venne svolta in modo semiclandestino a Arden Hills (Minnesota) e venne chiamata MACE (Mansfield And Cahlander Executive). Questo sistema operativo venne scritto in buona parte da un singolo programmatore che utilizzava il computer nelle ore libere del sistema. Le caratteristiche erano simili quelle di SCOPE 1 o di COS ma il sistema operativo era molto modulare e supporto prima la gestione dei dischi e dei nuovi dispositivi. Sebbene MACE non fosse un prodotto ufficiale CDC molto acquirenti ebbero una copia del sistema operativo da CDC.
MACE venne utilizzato in seguito come base per KRONOS (significato dell'acronimo incerto). La principale motivazione dello sviluppo di questo nuovo sistema operativo fu lo sviluppo del TELEX, una componente che permetteva la condivisione della macchina tra più programmi. Contestualmente venne rimossa la componente BATCHIO che si occupava della gestione batch dei processi. KRONOS utilizzava il file system di COS/SCOPER 1 con l'aggiunta di alcune innovazione.
Il tentativo di unificare SCOPE e KRONOS produsse NOS, il Network Operation System. NOS doveva essere il sistema operativo per le macchine CDC, la quale lo promosse fortemente. Molti acquirenti che utilizzano SCOPE erano troppo legati a SCOPE per poterlo abbandonare solamente per una richiesta di CDC. CDC quindi creò NOS/BE (Batch Environment) in modo da poter dichiarare che tutte le macchine utilizzano NOS. In realtà questo era una versione di KRONOS con leggere modifiche per permettere di gestire le caratteristiche di SCOPE che inizialmente non erano gestite.
Durante lo sviluppo vennero prodotti altri sistemi operativi che non vennero resi pubblici tra gli acquirenti. Questi sistemi operativi includevano il tools SMM per il controllo dell'hardware e KALEIDOSCOPE per il test del software.