Architettura CAM 8

La CAM 8 viene definita partitioning cellular automata per sottolineare il fatto che blocchi di celle vengono aggiornati in parallelo, mentre all'interno di questi blocchi l'aggiornamento avviene in modo sequenziale.
I fattori che hanno portato a una realizzazione con pochi processori e molte celle, sono imputabili al tipo di elaborazione richiesta: semplice, ma al tempo stesso efficace, in grado di avere elevata velocità di trasferimento dati e con architettura indefinitamente scalabile.
La CAM 8 realizza queste richieste, implementando il concetto di materia programmabile.
Il blocco più piccolo della CAM 8 con il quale costruire la desiderata configurazione hardware è il modulo. Ogni modulo è responsabile del suo sector, questo è un insieme di celle che lo stesso modulo ha il compito di aggiornare ogni volta un passo di elaborazione venga richiesto. Un sector ha 16 Mcells e ogni cella è composta da 16 bit.
Un modulo è costituito, oltre che dalla DRAM delle celle, anche da SRAM per le look-up table, che nel seguito chiameremo per semplicità LUT, e dal chip STEPchip, che è il vero nucleo elaboratore della macchina. Per l'esecuzione corretta di tutte le funzioni lo STEPchip possiede dei registri al suo interno, quali il registro kick o il registro scan, che sono molto importanti e che risolvono elegantemente alcune necessità di elaborazione altrimenti difficili da realizzare.
Le celle sono composte da pile di bit, abbiamo detto 16, e questi bit sono organizzati in layers, cioè ogni bit di una cella vede i bits ad uguale profondità delle altre celle: il primo bit della pila di una cella è in relazione con tutti i primi bit delle celle della CAM 8, formando il primo layer, e così per ogni posizione di profondità, come in figura 1.

L'aggiornamento o update dei siti avviene tramite LUT:

Questo per l'aggiornamento. La LUT quindi è responsabile dell'applicazione della regola e quindi verrà costruita in base a quest'ultima, considerando ogni ingresso dei 2^16 possibili valori: ad ogni possibile ingresso viene precalcolato il risultato e con l'insieme dei risultati viene redatta la tabella di update. La costruzione di questa tabella è compiuta da un host al quale la CAM 8 è collegata tramite il TBus, un bus progettato appositamente che verrà affrontato più avanti nel paragrafo tbus.
Una volta costruita, questa tabella viene trasmessa alla macchina e da questa memorizzata nella SRAM.
L'aggiornamento, e quindi la tabella, dovrà tenere conto dello stato dei siti e del loro vicinato, come vuole la teoria degli automi cellulari. Nella CAM 8 il vicinato non è direttamente visibile come si potrebbe supporre, ma proprio in questo punto sta la forza di questa macchina. Invero i siti sono rappresentati da uno stato a 16 bit ognuno dei quali appartiene ad un diverso layer formando 16 layers estesi su tutto lo spazio dei siti; questi layers possono scorrere uno rispetto all'altro. Alla gestione di questi layers sono preposti gli STEPchips, uno per ogni layer. Quindi, immaginando che lo stato di un sito possa essere rappresentato con un unico bit, al momento dell'update si copia il layer, che contiene lo stato dei siti, negli altri layers ed è quindi possibile rendere visibile ad ogni sito il suo vicinato semplicemente facendo scorrere i layers uno rispetto all'altro, della quantità e nella direzione opportuna, come mostrato in figura 2. Questo punto verrà approfondito nel paragrafo kick.

Riassumendo, una cella della CAM 8 non vede direttamente lo stato di una cella vicina, ma una sua copia direttamente nel suo spazio di stato. Questo libera l'utilizzatore da vincoli di vicinato, rendendo possibile vedere anche siti lontani e nel modo più veloce possibile, cioè semplicemente incrementando un registro, senza nessun trasferimento dati.
Un'implementazione di regole come quella HPP è semplicissima: è sufficiente assegnare ad ogni movimento possibile, cioè verso nord, sud, est o ovest, un layer, e le particelle che sono su questi layers subiranno questi spostamenti fino a quando non verrà verificata la presenza su due layers differenti di due particelle, e la regola di update semplicemente sposterà come dovuto le particelle da un layer a un altro, facendole proseguire su cammini diversi.
  1. Scan

    Focalizziamo la nostra attenzione su un singolo modulo. All'interno di questo modulo l'update dei posti avviene in modo sequenziale. L'ordine nel quale viene compiuto l'update non è importante, poiché il risultato è indipendente da esso. L'ordine può essere modificato per produrre effetti di visualizzazione, ad esempio un ingrandimento.
    Il settore assegnato al modulo non è rigido, ma è possibile dividerlo in sottosettori ciascuno dei quali usa la sua LUT per l'update.
    Lo scan è però indivisibile e ininterrompibile: esso è quell'azione che permette alla CAM 8 di considerare tutto il suo spazio di simulazione e di compiere su di esso ogni operazione necessaria. Questo viene svolto generando una sequenza di indirizzi di celle, autonomamente compiuta e temporizzata dal modulo.
    Funzionalmente lo scan è compiuto dallo scan index register SIR, un contatore autoincrementante a 24 bit che genera gli indirizzi di cella, si veda la figura 3.
    Il SIR punta alla DRAM delle celle, estrae il contenuto, con il contenuto si indirizza la SRAM della LUT, estraggo il nuovo stato dalla LUT e questo viene memorizzato nella cella ancora puntata da SIR, che poi si autoincrementa puntando alla cella successiva.

    Un registro end of scan pointer indica quando lo scan è terminato, permettendo così di limitare lo scan a una zona particolare.
    Il SIR viene combinato con il registro scan index permuter in modo da poter cambiare l'ordine di scan, vedere la figura 4, e con questo generare il site address finale, cioè l'indirizzo di una particolare cella memorizzata nella DRAM.

    Ogni STEPchip ha quindi questi registri che compiono lo scan dei siti, prendendosi cura di aggiornare uno dei 16 layers.
    Lo scan comunque non serve solo durante l'aggiornamento, vedremo più avanti che ogni volta voglia considerare la totalità delle celle per riscriverle, inizializzarle, aggiornarle, visualizzarle il meccanismo di scan sarà indispensabile.
  2. Kicking

    I vari layers hanno nella CAM 8 la capacità di scorrere uno rispetto all'altro. Questa caratteristica importante, che rende agile la programmazione, viene chiamata kicking.
    Il kicking viene eseguito tramite due registri: il registro offset e il registro kick. Ogni STEPchip ha questa coppia di registri e li utilizza per la gestione del proprio layer. Offset interviene sulla formazione del site address, indirizzo fisico delle celle, mentre kick agisce su offset, rendendo semplice la gestione di quest'ultimo. Ogni volta che viene formato un site address per indirizzare la DRAM, ad esempio durante uno scan, in ogni STEPchip l'offset viene sommato all'indirizzo fornito e con questo nuovo valore si estrae il dato, come in figura 5.

    Durante lo scan quindi ad ogni indirizzo viene sommato l'offset, e visto che ogni STEPchip ha il suo offset posso agire con estrema libertà e maneggevolezza: lo scorrere dei layer è implementato semplicemente cambiando l'offset.
    Ad ogni scan l'offset dovrà essere incrementato o diminuito in base allo scorrimento voluto; questo sarebbe un compito gravoso se non fosse effettuato dal registro kick, che automaticamente corregge il registro offset.

    L'array delle celle può essere reso multidimensionale, agendo sul registro Dimension Cut Mask, il quale contiene un 1 laddove una dimensione finisce e ne comincia un'altra.

    Con riferimento alla figura 7, l'ottavo bit è impostato ad uno, così la prima dimensione viene individuata attraverso i primi otto bits del site address. L'effetto di questi tagli operati da Dimension Cut Mask è quello di scorrelare due parti del site address in modo che possano essere autonomi (vedere figura 8).

    Non essendo lo spazio di celle infinito, bisogna gestire in qualche modo i bordi dello spazio delle celle: uno shift delle celle ai bordi sarebbe indefinito se non fornissi un metodo di controllo. Lo STEPchip si occupa anche di questo e questa gestione prende il nome di gluing, affrontata nel seguente paragrafo.
  3. Gluing

    Il discorso sul gluing è forse il più complicato per quanto riguarda la CAM 8. Restringendo l'attenzione a un singolo isolato settore, l'effetto di un kick sarà uno shift circolare dei dati del settore. Così, i siti che all'estrema sinistra del settore sono traslati all'esterno, vengono successivamente inseriti all'estremità opposta dello stesso settore. Immaginando uno spazio più ampio con molti settori, i siti che escono da uno di questi, traslati all'esterno da un kick, vengono inseriti all'interno del settore adiacente, secondo le connessioni volute. La glue è proprio quel procedimento che permette di shiftare i dati da un modulo a un altro, realizzando un grande nastro trasportatore. Le connessioni sono completamente riprogrammabili attraverso dei registri appositi per raggiungere ogni tipo di configurazione voluta, anche la più contorta, come ad esempio uno spazio elicoidale.
  4. Ingressi

    La CAM 8 sarebbe limitata se tutto quello che potesse fare con le proprie celle fosse usare il contenuto della DRAM per indirizzare la LUT. Per esempio, come potrei inizializzare lo spazio con dei valori a mia scelta? Il normale funzionamento della CAM 8 è l'update tramite LUT, ma sono state previsti, proprio per venire incontro a esigenze disparate, altri tipi di ingressi, in tutto quattro, che possono cambiare lo stato delle celle. Ognuno di questi quattro ingressi può essere combinato con lo stato antecedente della cella per calcolare il nuovo stato. I possibili ingressi sono:
    1. Unglued data
    2. Host
    3. Flywheel
    4. LUT
    Il primo tipo di ingresso entra in gioco quando non si vuole realizzare nessuna connessione glued con altri moduli, i dati shiftati sono così riportati allo stesso settore, e proprio per questo comportamento viene chiamato unglued.
    Il secondo tipo, Host, viene utilizzato per trasferire dati dal computer host, al quale i moduli CAM 8 sono collegati, agli stessi moduli, per modificare tutto o in parte lo spazio dei siti. Quando il computer host vuole scrivere direttamente nella DRAM, esso scrive nello Scan IO Register, e la cella puntata dallo Scan Index Register viene impostata al valore del SIOR. In questa operazione viene tenuto conto anche dell'offset, per non perdere le potenzialità del meccanismo di kick.
    Il terzo tipo, Flywheel, permette ad un sistema di acquisizione di inserire dati direttamente all'interno delle celle, ad esempio una telecamera puo' riempire lo spazio dei siti con una immagine.
    Infine, l'ultimo tipo, LUT, è l'ingresso normalmente usato: un update compiuto attraverso regole memorizza nei siti questo tipo di dati.
    Quindi, come si può notare, per ogni esigenza esiste un ingresso ottimizzato per quel compito, e ciò rende l'acquisizione molto rapida.
    Inoltre le sorgenti selezionate possono essere combinate con i dati Glued, tramite una funzione booleana scelta tra 16 possibili. Ogni STEPchip ha cinque registri Destination Select, che selezionano uno dei quattro possibili ingressi, e cinque corrispondenti registri Destination Map, che selezionano una delle 16 funzioni booleane per combinare l'ingresso scelto con i dati glued, per produrre il nuovo valore per la destinazione.
  5. Destinazioni

    Così come per gli ingressi, anche per le uscite sono state pensate soluzioni ottimali per varie necessità. Più che uscite bisogna parlare in queste caso di destinazioni, il termine è certamente più appropriato, poiché in alcuni casi non si ha una vera e propria uscita di informazioni verso l'esterno, così come, a dire il vero, anche per l'ingresso LUT non si ha un vero ingresso esterno, ma noi consideriamo le celle come la parte più significativa del nostro esperimento, quindi possiamo riferirci ad esse quando parliamo di ingressi e di uscite Le destinazioni sono di cinque tipi:
    1. Lookup Table Address
    2. Flywheel Output
    3. Site Data
    4. Event Count
    5. Display
    Il primo tipo, LUT address, è costruito combinando i singoli bit che ogni STEPchip genera, che non sono altro che i bit che compongono lo stato della cella, o per meglio dire i valori che una cella assume sui vari layer. Infatti l'incaricato di gestire un singolo layer è proprio lo STEPchip, ed esso, durante uno scan, attraversa tutte le posizioni ed estrae il bit corrispondente all'indirizzo di scan e quest'ultimo combinato con gli altri bits forniti dagli altri 15 STEPchip formano il LUT address a 16 bit (vedere figura 8). Il LUT adress servirà poi per puntare alla SRAM ed estrarre il nuovo stato della cella in questione. Il secondo tipo, Flywheel Output, è un meccanismo di uscita degli stati delle celle che li rende disponibili a un dispositivo esterno. Il terzo tipo, Site Data, è la normale destinazione delle elaborazioni: i dati vengono scritti nelle celle tenendo conto degli offset. Il quarto tipo, Event Count, è forse il più interessante, perché permette di verificare alcune situazioni particolari automaticamente, senza alcun bisogno di ulteriori elaborazioni. Ogni STEPchip mantiene aggiornato un contatore di eventi, che può essere visto come una destinazione, dove i dati non vengono scritti, ma contati. L'ultimo tipo, Display, è il meccanismo col quale gli stati delle celle vengono riportati al computer host, presumibilmente, ma non necessariamente, per scopi di visualizzazione. Così come il SIOR serviva all'host per scrivere le celle direttamente, l'host può leggere il SIOR mentre il SIR scandisce tutte le celle.
  6. Conteggio degli eventi

    Quando si svolgono delle simulazione la parte più importante del lavoro è senz'altro l'interpretazione dei risultati. I risultati di una elaborazione tramite automi cellulari saranno ovviamente immagini o pattern visibili su uno schermo tramite un computer host. Spesso però non basta avere una visione globale di quello che è successo al nostro pattern iniziale. La CAM 8 ha al suo interno una serie di registri che possono agevolare il lavoro di interpretazione: essi sono in grado di contare il verificarsi di eventi, decisi dallo sperimentatore, con ampia possibilità di scelta. Ognuno dei 16 layer della CAM 8 conta il numero di volte che una specificata funzione booleana tra due sorgenti interne viene verificata. Una sorgente è il sito, mentre la seconda è determinata dal registro Event Source, il quale è composto da due sottoregistri: Event Source.Select ed Event Source.Map. Il primo ovviamente sceglie il secondo ingresso tra questi quattro tipi: di cui abbiamo già affrontato i significati. Il secondo sottoregistro è impiegato per specificare la desiderata funzione logica impostato attraverso comandi specifici che vengono affrontati nel CAMForth.
  7. Tbus

    L'attività dei moduli CAM 8 è governata e controllata da un computer host. Questo è una Sun SPARCstation, la quale ha un bus esterno ad alte prestazioni chiamato SBus. Ogni controllo sui moduli è mediato dallo STEP controller, una scheda fisicamente connessa sull'SBus . Lo STEP controller a sua volte invia i comandi ai moduli tramite il TBus, un bus proprietario tree-like appositamente ideato per questo scopo. Guardando la figura 9 si nota che lo STEP controller è la radice dell'albero, mentre i moduli sono le foglie.
    Il TBus può essere realizzato bilanciato o sbilanciato. Nel caso di bus bilanciato siamo sicuri che i comandi arrivano ai moduli in perfetta sincronia, quindi non è necessario occuparsi di tali problemi. Invece nell'albero sbilanciato ad alcuni moduli i comandi arriveranno prima che ad altri, quindi dovremo inserire dei ritardi di esecuzione calibrati nei moduli vicini alla radice. L'inserimento dei ritardi avviene tramite registri degli STEPchips chiamati Hardware Environment Register, per maggiori dettagli vedere la documentazione STEP1.


Ritorno al precedente