Teoria dell’Informazione: SHANNON Nel 1948, Shannon (matematico e informatico USA) pubblico' uno dei suoi piu' importanti articoli, "A Mathematical Theory of Communication", col quale dava vita alla teoria dell'informazione. Anche in questo caso la motivazione era pratica: come trasmettere informazione senza che sia confusa o danneggiata* con il rumore presente in un canale di trasmissione? Per analizzare correttamente questo problema, egli capi' che era necessario trovare una definizione formale del concetto di "informazione". La sua teoria afferma che la quantita' di informazione in un messaggio non ha niente a che fare con il suo contenuto ed il suo significato, ma soltanto con la quantita' di zeri e di uno necessari per trasmetterlo, tramutando analoghe affermazioni teoriche dall’Algebra di Boole. Questo fu un punto di vista completamente nuovo, perche' fino a quel momento gli ingegneri pensavano alle telecomunicazioni esclusivamente come la trasmissione di onde elettromagnetiche attraverso un canale. Ma nessuno aveva mai teorizzato che ogni tipo di messaggio, indipendentemente dalla sua natura (immagini, suoni, parole), potesse essere sempre ridotto a 0 e 1. Al giorno d'oggi, in cui sugli stessi cavi dove viagga la voce del telefono passano anche pagine Web, MP3 e filmati, questa idea ci sembra ovvia. Ma le sue radici sono nella pubblicazione di Shannon, in cui per la prima volta compare la parola "bit". Shannon mostro' anche che se ad un messaggio vengono inseriti dei bit di informazione aggiuntiva, questi possono essere usati per correggere errori ed assicurare la corretta trasmissione anche in un canale con un livello di rumore molto elevato. Quesa idea e' stata sviluppata negli anni successivi fino a raggiungere gli attuali codici a correzione d'errore. In generale in una trasmissione digitale se il rumore non supera una certa soglia quantizzata il segnale viene trasmesso correttamente. * ad esempio il bit di parità per controllare se la trasmissione e’ stata regolare Pagina 1 di 30 Entropia e Ridondanza Un esempio elementare è il seguente: immaginiamo di ricevere una telefonata in cui qualcuno ci dice che "il missile per la Luna parte alle nove del mattino". Per qualche motivo lungo la linea ci sono disturbi che cancellano parti importanti della frase, di conseguenza non riusciamo a capire assolutamente nulla. Supponendo che il messaggio trasmesso sia registrato, quindi sempre uguale alla fonte, proviamo a riascoltarlo. Di nuovo disturbi, e dunque di nuovo parti cancellate, a caso, cioè non sempre allo stesso modo. Anche se l'ascoltassimo mille volte, la casualità dei disturbi non ci permetterebbe mai di capire ciò che ci viene trasmesso. Ora supponiamo di registrare tre volte l'incomprensibile messaggio in arrivo e di sovrapporre le tre registrazioni con un mixer. Alcune parti dei diversi rumori possono andare insieme e diventare intelligibili come per esempio: "...miss...una...ttino". Così potremmo arguire che si tratta di una "missione su una duna con un pattino". Sbaglieremmo clamorosamente, ma, riprovando con il nostro mixer a sovrapporre ancora più registrazioni, giungeremo al punto in cui, anche senza avere la frase completa, riusciremo a capire tutto perfettamente . Come mai? Abbiamo creato una ridondanza per cui, sfruttando lo spostamento casuale delle cancellazioni dovute ai disturbi, abbiamo sovrapposto disturbi e parole in modo da ricreare le parole e rendere innocui i disturbi. Ciò può succedere soltanto perché nella nostra memoria ci sono le parole e le sappiamo distinguere dal rumore che le disturba. Non avremmo potuto in nessun modo rendere intelligibile 1) informazione che non c'era e 2) informazione che non eravamo in grado di capire una volta ricomposta parzialmente. Infatti possiamo comprendere la frase anche senza avere esattamente tutte le lettere delle parole: in questo caso la ridondanza è nella struttura del linguaggio, il quale è abbastanza ricco da permettere la comprensione anche se il messaggio è ancora incompleto, come per esempio in: "i... mis...ile per ...a Lun... part... a...le nov... del matti...o". Possiamo dire che il sistema e’ Ridondante quando l’informazione data dal simbolo e’ certa, quindi con informazione nulla. Ad esempio in inglese alla lettera Q segue sempre la lettera U, e’ percio’ inutile tramettere la U, visto che il testo rimane comprensibile. Pagina 2 di 30 Altri esempi. Tutti hanno sentito musica in un Compact Disc. Ebbene, la tecnologia per la sua realizzazione era nota da anni (il laser fu inventato nel 1960 sulla base di ricerche risalenti al 1954), ma solo da poco si è riusciti ad ascoltare musica o registrare immagini tramite questa tecnologia, perché dal punto di vista ingegneristico era impossibile sfruttare meccanicamente le sue potenzialità per un supporto musicale. Tecnicamente la lettura di un Cd non differisce da quella di un normale codice a barre su di una scatola di biscotti. Solo che su quest'ultima c'è solo il prezzo, al massimo un codice, poche cifre, mentre in un Cd vi sono miliardi di informazioni del tipo sì-no, cioè bit. Per leggere il codice a barre sulla scatola di biscotti, presentata in qualsiasi posizione, un raggio laser lo illumina più volte e in diverse direzioni, poi, in base alla ridondanza ottenuta con la sua molteplice lettura (velocissima), esso è memorizzato correttamente e, con l'elaborazione dei dati, si elimina ciò che non interessa e si ricompongono gli eventuali pezzi esenti da errore. Con il Cd il procedimento è più o meno lo stesso. Sarebbe impossibile ottenere una lettura meccanica precisa dei microscopici segni sul supporto: o si ingrandiscono i segni, e allora cesserebbe lo scopo, dato che non si potrebbero immagazzinare che pochi minuti di musica; oppure si costruisce un lettore mostruosamente preciso e allora non sarebbe costruibile in serie, e tantomeno vendibile a causa dell'elevato costo di produzione. Il problema si risolve facilmente: si incide il segnale in modo ridondante affinché sia in scrittura che in lettura l'informazione ripetuta possa essere ricostruita da un microprocessore che memorizza un algoritmo adatto allo scopo. Insomma, si raggiunge l'obiettivo non aumentando la precisione ma, al contrario, aumentando semplicemente la possibilità di afferrare un messaggio grossolano tramite l'elaborazione delle informazioni ridondanti in esso contenute. La decodificazione dei cifrati, le trasmissioni di dati via modem, la gestione dei sistemi complessi, i collegamenti radio con satelliti spediti ai confini del sistema solare, e... l'invio di uomini sulla Luna, sono ottenuti con metodi in cui si estrae il massimo d'informazione dalla ridondanza esistente o prodotta, oppure si introduce informazione in un sistema di per sé dissipativo, entropico, trasformandolo in un sistema che tende ad essere "organico", cioè antientropico e antidissipativo. Pagina 3 di 30 Se la sorgente emette sempre e solo lo stesso simbolo il valore di H è=0 L’evento certo non fornisce nessuna informazione. Entropia . H rappresenta l'informazione media di un generico simbolo emesso dalla sorgente, ottenuta pesando l'informazione di ogni possibile simbolo con la probabilità del simbolo stesso. Ad esempio le lettere dell’alfabeto. Quante volte una lettera o una parola viene ripetuta in una frase o in un discorso o in una trasmissione dati. Quante probabilità ci sono che la lettera A sia ripetuta? Il concetto va tradotto in questo modo : esempio, alle lettere dell’alfabeto viene associato un corrispettivo codice nei computer:0,1 Si assocera’ un codice piu’ complesso alle lettere che si usano meno frequentemente e piu’ semplice a quello di uso comune Si utilizza il Teorema di Shannon in generale laddove ci siano problemi di campionatura: Compressione Immagini ( i vari formati .jpg, .gif) Compressione Audio/Video (.Avi) Modem Scrambler (apparecchio per criptare) Formula H= -log2 P (P=probabilità che il simbolo venga emesso) Esempio: lancio di una moneta, ogni faccia corrisponde a 0.5 H=1/2(peso dell’informazione associata al simbolo) log2 ½ - 1/2 log2 ½ H=1 bit Pagina 4 di 30 EVOLUZIONE DEL CALCOLATORE dagli anni ' 70 Da: http://www.lithium.it/articolo0017p2.htm Iniziamo direttamente dagli anni '70, da quando cioè furono introdotti i primi calcolatori basati su transistor altamente integrati, ed esaminiamo la situazione hardware/sofware dell'epoca: 1) le memorie erano a nucleo (core) magnetico: in altri termini erano lente, grosse e costosissime. Un esempio di memoria di questo tipo è dato dal componente nella figura ( l'uomo tiene in mano un 'modulo di memoria' da qualche centinaio di byte costituito da piccoli toroidi di materiale ferromagnetico e dai fili che ne alteravano lo stato di magnetizzazione tramite corrente elettrica). 2) esistevano i compilatori, ma facevano acqua da tutte le parti: il codice da questi prodotto era poco ottimizzato e spesso talmente "sporco", cioè inefficiente, che conveniva lavorare direttamente in assembler, spendendo ore ed ore a scrivere codice che poi risultava difficile da correggere. 3) i dispositivi di memoria secondaria, anch'essi magnetici, erano ancora più lenti e anch'essi molto costosi. La conseguenza di tutto ciò è evidente: i programmi dovevano essere molto semplici e molto compatti per risiedere in una memoria dalle dimensioni di pochi Kbytes. Con l'avvento delle memorie dinamiche a semiconduttore, a metà degli anni '70, la situazione migliorò un poco, ma basta guardare la tabella in basso per avere un'idea dei costi. Lo stato di integrazione era di poche migliaia di transistor su un singolo die di silicio, e per avere un dispositivo completo di tutte le funzioni necessarie occorreva collegare più chip , ognuno con mansioni diverse, sulla medesima scheda madre (ricordate che ancora una decina di anni fa il 386 aveva bisogno del coprocessore matematico a parte per svolgere i calcoli in virgola mobile?;-). Pagina 5 di 30 Da:http://bonda.cnuce.cnr.it/Documentation/ateach/ei/lucidi/Cap_4-1__Le_infrastrutture_hardware.pdf Evoluzione delle CPU Da http://www.technologyreview.it/index.php?p=article&a=488 La Legge di Moore, che ha celebrato quest’anno il suo 40esimo anniversario, è stata il regalo più grande per l’industria dei semiconduttori. Nel 1965 Gordon Moore, uno dei fondatori di Intel, previde che il numero di transistor su un chip computerizzato sarebbero raddoppiati ogni due anni. Allora un chip ospitava solo qualche decina di transistor. Oggi il chip più avanzato di Intel contiene più di 1 miliardo e 700 milioni di transistor e si calcola che il loro numero nel 2012 supererà i 10 miliardi. Le più recenti CPU per computer da tavolo, per esempio, consumano 100 watt di potenza. Le CPU per portatile sono in genere più efficienti, poiché sono progettate per massimizzare la vita della batteria, ma arrivano ugualmente a consumare 75 watt. ‹‹È come mettere un tostapane nel portatile››, afferma Pat Gelsinger, vicepresidente di Intel. Una soluzione che probabilmente si diffonderà consiste nell’aumentare il numero dei transistor su chip non rimpicciolendoli, ma semplicemente replicando lo stesso schema di circuito due o più volte sulla stessa fetta di silicio. Intel ha rilasciato i suoi primi chip ‹‹a nuclei integrati›› all’inizio del 2005. I dirigenti di Intel prevedono un futuro di chip ‹‹multinucleo››, con oltre un migliaio di processori uno accantoall’altro. Ma c’è un problema. I fili di rame che trasmettono il flusso di 1 e 0 digitali dentro e fuori il computer, e tra i processori in alcuni computer, possono trasportare solo una determinata quantità di dati così rapidamente. ‹‹Se raddoppio la prestazione (di un processore), devo anche raddoppiare la prestazione in entrata e in uscita del chip››, dice Gelsinger. ‹‹Il rame, la nostra tradizionale tecnologia di collegamento, non regge queste velocità››. Il problema è che gli impulsi elettrici che viaggiano attraverso i fili di rame incontrano la resistenza elettrica, che degrada l’informazione che loro trasportano. Quindi i bit dei dati che viaggiano con il rame devono essere sufficientemente distanziati e muoversi abbastanza lentamente in modo che i Pagina 6 di 30 dispositivi all’altra estremità del filo possano recuperarli. Questa limitazione ha già provocato seri ingorghi sulle reti di area locale che utilizzano fili di rame per le connessioni tra computer DA: http://www.lithium.it/articolo0017p2.htm Splittare le mansioni su più chip, tenendo pure conto della limitazione di banda dei bus, cioè delle piste di rame sulla scheda, introduceva ulteriori ritardi nel trasferimento dei segnali digitali da una parte all'altra. ( il problema si è ripresentato in tempi recenti, da quando cioè si parla del collo di bottiglia costituito dall'interfaccia memoria-chipset e chipset-processore, in cui le centinaia di Mhz dei bus attuali finiscono per creare diafonia fra le varie piste). Si avvertiva la necessità di impacchettare quanta più logica possibile su un singolo chip, anzichè rivolgersi ad architetture distribuite. Il progresso tecnologico sulla via della miniaturizzazione dei dispositivi condusse, nel lontano 1971, al debutto del primo processore della Intel (Integrated Electronics), di cui sotto vedete un esemplare. Il 4004 era a tutti gli effeti un 'mini-computer' per l'epoca, in quanto all'interno inglobava tutta la logica per funzionare come processore general-purpose, cioè per applicazioni generali. Consisteva di 2300 transistor, il package era dotato di soli 16 piedini per la comunicazione col mondo esterno. I registri cioè i dispositivi di memorizzazione interni, erano a soli 4 bit (da cui la terminologia architettura a 4 bit dell'Intel 4004), poteva decodificare al massimo 45 istruzioni e correva intorno al KHz. Sembra poco, ma fu un chip rivoluzionario poichè stabilì in via definitiva il percorso che avrebbe seguito l'elettronica negli anni a venire: e cioè cercare di integrare quante più funzionalità possibili all'interno di un singolo chip, permettendo ad applicazioni di natura diversa di girare sullo stesso processore. Per avere un termine di paragone sull'importanza dell'integrazione, basti pensare che nelle missioni Apollo degli anni '60, quelle che portarono gli americani sul suolo lunare, il computer deputato al controllo di guida del razzo era composto da 5000 chip, ognuno a sua volta composto da tre transistor e 4 resistenze! In breve ci si rese conto come un microprocessore fosse infinitamente superiore ad una struttura distribuita per una serie di ragioni che elencherò brevemente: 1) consuma di meno 2) produce meno calore e quindi richiede soluzioni meno raffinate per il raffeddamento 3) occupa meno spazio 4) è più affidabile, cioè si guasta con meno frequenza rispetto ad una soluzione cablata, perchè tutte le componenti interne nascono con lo stesso procedimento e non esistono saldature che possano saltare 5) è più veloce perchè i segnali percorrono cammini più brevi e quindi si può salire in frequenza. 6) è più economico da produrre su larga scala. Pagina 7 di 30 Microprocessore Cisc o Risc ? CISC = Complex Instruction Set Computing Una filosofia di questo tipo, in cui si cerca di avere un ISA (Instruction Set Architecture) che sia il più flessibile possibile e che faciliti il debugging del codice prodotto dai compilatori, è nota come approccio CISC al progetto di un microprocessore. Il livello ISA (Instruction Set Architecture) descrive l'architettura delle istruzioni che la CPU è in grado di eseguire in Hardware (Firmware=software creato dal costruttore con le istruzioni da eseguire). Ogni diversa CPU ha un proprio ISA e quindi istruzioni diverse spesso non compatibili tra loro. Scrivere programmi complessi utilizzando direttamente istruzioni ISA è difficile e spesso inutile. In quasi tutti i calcolatori è possibile scrivere programmi utilizzando linguaggi di alto livello (più orientati all'uomo: esempio C++) che vengano compilati (ovvero tradotti in istruzioni ISA) da programmi chiamati Compilatori. Quando si parla di Assembly language si intende un linguaggio costituito da codici mnemonici corrispondenti alle istruzioni ISA. In realtà, il linguaggio Assembly fornisce altre facilitazioni al programmatore, quali etichette simboliche per variabili e indirizzi, primitive per allocazione in memoria di variabili, costanti, definizione di macro, ... che semplificano il compito al programmatore (vedi Assembly language Inline). • Un programma "semplice" detto Assembler (Assemblatore) traduce i codici mnemonici nei codici numerici corrispondenti alle istruzioni ISA. L'insieme di questi codici costituisce i programmi eseguibili che possiamo eseguire nei nostri PC. Da: http://www.di.uniba.it/~archicdl/slide/1-ISA-8086.pdf Pagina 8 di 30 Struttura CPU Ciclo Fetch–Decode– Execute (leggi–decodifica–esegui) 1.Prendi (fetch) l’istruzione corrente dalla memoria e mettila nel registro istruzioni(IR). 2.Incrementa il program counter(PC) in modo che contenga l’indirizzo dell’istruzione successiva. 3.Determina il tipo dell’istruzione corrente (decodifica = decode). 4.Se l’istruzione usa una parola in memoria, determina dove si trova. 5.Carica la parola, se necessario, in un registro della CPU. 6.Esegui l’istruzione. 7.Torna al punto 1 e inizia a eseguire l’istruzione successiva. Nota BUS= Insieme di segnali binari associati ad informazioni dello stesso tipo 1. bus dati, trasporta i dati 2. bus indirizzi, indirizzi di memoria 3. controlli, per guidare l’attività di elaborazione Il parallelismo dei bus e’ definito dal numero di bit necessari per codificare i dati, indirizzi e controlli. In particolare si applica al Bus Dati che definiscono il N° di bit elaborati contemporaneamente in ogni istruzione CPU ed al Bus Indirizzi in cui il N° di bit definisce il numero di celle della memoria accessibili direttamente, esempio: • Bus Dati a 64 bit • Bus Indirizzi a 32 bit (2 32 =4,3 miliardi circa di locazioni di memoria ognuna fatta da 8 byte=64 bit). Pagina 9 di 30 Riferimenti alle informazioni In linguaggio macchina ci si riferisce ad un dato specificandone la posizione in memoria. Un dato può trovarsi in una delle seguenti memorie: – Memoria centrale – Registro – Stack Pagina 10 di 30 Indirizzo iniziale + offset = Indirizzo fisico Pagina 11 di 30 Pagina 12 di 30 Pagina 13 di 30 Pagina 14 di 30 NOTA Per ottimizzare l’impiego della CPU si usa la tecnica di trasferimento ad Interrupt (IRQ). Alla ricezione dell’interrupt (generato ad es. dalla tastiera) la CPU termina l’istruzione corrente, salva il contenuto dei propri registri nello stack e passa ad eseguire la routine di quel dispositivo chiamante Con la tecnica DMA (Direct Memory Access) si trasferiscono i dati dalla memoria direttamente alla periferica senza far intervenire la CPU. Pagina 15 di 30 CISC è un acronimo e sta appunto per Complex Instruction Set Computing, cioè architettura costituita da un insieme, o set, di istruzioni complesse. Fin qui sembrerebbe tutto rosa e fiori: abbiamo solo aiutato i programmatori a scrivere codice assembler più semplice, quindi più veloce da correggere, e abbiamo dunque ovviato al grave problema del costo del debugging del software, che all'epoca era molto sentito giacchè la memoria era assai costosa e il codice compilato doveva essere il più possibile denso e ottimizzato. All'epoca non esisteva il concetto di una memoria veloce ma piccola (l'odierna cache) da affiancare al processore, e a causa del mantenimento della compatibilità con i vecchi ISA, la maggior parte delle istruzioni prevedevano un sacco di accessi in lettura e scrittura alla memoria di sistema, la RAM, per intenderci . Vediamo di chiarire le idee con un esempio: possiamo schematizzare la memoria di sistema come un array, cioè un insieme ordinato, di celle aventi una certa dimensione in byte. Il processore è schematizzabile, per i nostri scopi, come un elemento che, dietro i comandi impartiti da una logica di controllo, preleva i dati dalla memoria centrale (fase di read o load), li elabora (fase di execute), e una volta processati scrive i risulati finali (fase di write back o store) nuovamente in memoria. Questo schema descrive l'arcinota macchina di Von Neumann, dal nome del cervellone che ideò lo schema base del funzionamento di un calcolatore negli anni Quaranta . Potete pensare alla macchina di Von Neumann come ad un tizio con un braccio solo: può eseguire una sola operazione alla volta , prelevando documenti da uno scaffale, riordinandoli, e riporli nuovamente nello scaffale una volta riordinati. La figura sottostante chiarisce le idee : Il problema di una tale soluzione è che il concetto di memoria è molto "nebuloso": un dispositivo di memorizzazione può essere un registro (che funziona alla velocità di clock del processore in cui è inglobato), una cache, una RAM di sistema o ,alla peggio, l'intero Hard Disk! Pagina 16 di 30 Ribellione allo standard : nascita del RISC (Reduced Instruction) Alla fine degli anni Settanta e nei primi anni Ottanta la situazione era cambiata: i compilatori erano divenuti molto più efficienti, le memorie meno costose e i progettisti di microcomputer stavano scoprendo che la "panacea" data dall'implementazione in hardware di istruzioni complicatissime e a volte strampalate stava costituendo un tappo per il miglioramento delle performance. Si cominciò allora a pensare ad un modo diverso di progettare un microprocessore, e le linee guida di progetto possono essere così riassunte: 1) Sulla base di una analisi statistica dei programmi, si scopre che per il 90% del tempo il processore utilizza sempre un ristretto sottinsieme di istruzioni. 2) Perchè allora non ottimizzare il processore nell'esecuzione diretta di queste poche istruzioni lasciando al compilatore l'onere di spezzettare le istruzioni più rare e molto più complesse in task più semplici? In tal modo torna in auge il ruolo del compilatore e si può fare a meno della ROM di decodifica. 3) Non solo: se il processore è in grado di eseguire direttamente in modo ottimizzato poche ma importanti istruzioni, facciamo in modo che ogni istruzione venga completata in un solo ciclo di clock!! 4) Inoltre, l'esecuzione dei programmi è spesso rallentata dai ripetuti accessi in memoria centrale ordinati dalle varie istruzioni con indirizzamento complesso: decidiamo allora di fare tabula rasa di queste istruzioni e stabiliamo che l'accesso in memoria avvenga esclusivamente tramite due comandi: il load per il caricamento del dato dalla memoria al registro e lo store per la scrittura dal registro alla memoria. 5) Visto che gli accessi in memoria centrale adevono essere limitati il più possibile, occorre disporre sul chip di un consistente numero di registri per avere un magazzino di informazione sufficientemente capiente da consentire l'elaborazione dei dati . DIFFERENZA TRA RISC E CISC Pagina 17 di 30 CONCLUSIONE Dopo quanto detto è abbastanza evidente come nello scontro CISC vs RISC sia stata quest'ultima filosofia ad aver avuto la meglio. Di processori RISC oggigiorno ne abbiamo piene le letteralmente le tasche: dai palmari ai cellulari della prossima generazione, oggi ogni processore che voglia essere snello e al contempo potente nasce sotto l'effige del RISC. Gli stessi processori x86, come abbiamo visto hanno assimilato il paradigma RISC unica e vincente mossa che ne ha prorogato la vita oltre ogni rosea aspettativa. Del resto il percorso di sviluppo delle capacità di un processore non si ferma a quello che abbiamo detto. L'obiettivo di qualsiasi progettista di processori è quello di ottenere sempre il max throughput complessivo, cioè , il massimo volume di dati processati e consegnati in uscita nell'unità di tempo. Come conseguire il massimo rendimento? la parola d'ordine in questi casi è parallelismo. Il parallelismo è stato il passo successivo compiuto dalla tecnologia dei processori dopo l'affermazione del RISC. Questo si esplica principalmente in due modalità differenti all'interno di un singolo processore: il pipelining e il superscaling. Un'altra tecnica di ottimizzazione delle risorse è il multithreading, che come scuola di pensiero ha pochi anni alle spalle. Bisogna sapere, che la velocita’ di letture dei dati da una memoria da un notevole rallentamento sulle prestazioni finali dell’esecuzione di un’istruzione, per superare questo problema si e’ pensato di rendere i dati richiesti dal processore disponibili ancora prima che esso li cerchi. Questo meccanismo e’ detto prefetching ed e’ utilizzata per evitare che il processore debba attendere che le informazioni vengano reperite, lette e portate ad esecuzione. La tecnica denominata pipelining e’ il concetto di dividere un'unica operazione in tanti piccoli passi. Per esempio potremmo dividere il datapath (percorso dati) in 4 parti. Facendo questo avremo il primo stadio che legge le istruzioni dalla memoria (prefetching) e che le mette nei registri, la seconda fase dove l’ALU legge gli operandi, la terza che esegue l’istruzione e l’ulitma che scrive il risultato nei registri. Pagina 18 di 30 La nuova tecnologia dual core / multi core In passato i produttori di chip hanno puntato prevalentemente sul costante incremento delle frequenze di clock per migliorare le prestazioni e, per esempio, alcuni azzardavano per il futuro frequenze operative anche fino a 10 GHz. In realtà negli anni sono intervenuti anche diversi problemi che hanno limitato la crescita delle frequenze di clock. Per esempio la semplice riduzione di dimensioni dei transistor realizzata passando a nuovi processi produttivi, non è bastata a contenere la dissipazione termica, ormai arrivata oltre la soglia dei 100 W. In pratica si è avuto un incremento parallelo, anche se non proporzionale, della dissipazione delle Cpu con l’aumentare del numero di componenti interni e delle frequenze operative. Il punto è che si è arrivati oramai a livelli di dissipazione che rendono il raffreddamento del processore un compito piuttosto arduo per componenti a basso costo. Con il tempo è diventato piuttosto chiaro che l’incremento costante delle frequenze di clock non sarebbe stato più sostenibile a lungo, a meno di radicali cambiamenti nei processi produttivi e nelle architetture delle Cpu (il Pentium M è un esempio di questi cambiamenti, visto che opera a frequenze più basse dei Pentium 4 a parità di prestazioni con i più diffusi applicativi). Dividere i compiti Di fatto l’elaborazione parallela, quella ottenibile da più processori che lavorano simultaneamente, risolve in parte il problema della necessità di crescita delle prestazioni senza essere costretti a incrementare le frequenze di clock. Se, infatti, si considera che le capacità di calcolo sono sostanzialmente legate al numero di operazioni eseguite per ogni ciclo di clock moltiplicato per la frequenza di clock, è chiaro che se si riesce a eseguire un numero maggiori di operazioni in parallelo, il secondo fattore, cioè la frequenza di clock può scendere senza condizionare le performance (questo in teoria, dato che moltissimo dipende dal software che deve essere scritto per poter sfruttare la presenza di due processori). La soluzione migliore per l’elaborazione parallela è quella di disporre di due processori distinti, in modo da avere due set completi di risorse a disposizione. I processori dual core però non soddisfano esattamente questi requisiti dato che hanno comunque almeno una parte in comune, lo zoccolo e un numero limitato di pin per i segnali, e quindi una parte delle risorse deve comunque essere condivisa. La terza situazione è quella di un unico processore come per esempio Pentium 4 Ht, che viene “visto” dal sistema come due Cpu logiche che lavorano in multiprocessing simmetrico (Smp) e eseguono, se possibile, due thread in parallelo. Di fatto le unità di esecuzione, le cache, il controller del bus, il sistema di branch prediction e altri sono in comune, mentre sono duplicati solamente pochissimi elementi come una parte dei registri e il Programmable Interrupt controller. Questo significa che il software non ha a che fare con due processori completi e fisicamente distinti, e quindi che il guadagno di performance rispetto alla soluzione e con singola Cpu senza Hyper Threading spesso è molto limitato. Anche per le Cpu dual core comunque ci sono svariate soluzioni per implementare due processori all’interno di un unico contenitore. Per esempio, si può duplicare esattamente il core di un processore (unità di esecuzione, memorie cache, bus eccetera) oppure avere separate solo le unità di esecuzione e condividere i controller e i bus, o anche condividere parte delle memoria cache. Intel e Amd hanno, infatti, usato soluzioni architetturali diverse per rispettivi processori dual core. Pagina 19 di 30 Il Pentium D di Intel Durante l’ultima edizione di Idf Intel ha presentato ben quindici progetti legati al multi core e destinati in pratica a tutti i vari segmenti, dai portatili ai server. La roadmap è molto aggressiva visto che per il 2006 Intel prevede che il 70% dei suoi processori per desktop e portatili saranno dual core, percentuale che sale all’85% per i server. Il secondo trimestre 2005 è il periodo scelto per il lancio dei primi processori dual core per Pc del segmento mainstream. Il core è quello conosciuto in precedenza con il nome in codice Smithfield e in pratica si tratta di due Pentium 4 sullo stesso die di silicio che condividono le connessione dello zoccolo in comune. Il package definisce quale die è il core 0 e quale il core 1, e quindi il device per il boot (il core 0). Anche se sono racchiusi nello stesso contenitore, il software è perfettamente in grado di distinguere tra i due core La frequenza operativa dei due core, 3,2 GHz, è relativamente bassa se confrontata con quella dei precedenti modelli a singolo core (in pratica è quella di un Pentium 4 540). Anche il Front side bus a 800 MHz non è quello più veloce (1.006 MHz) attualmente disponibile per le Cpu Pentium 4. La quantità di cache al secondo livello disponibile è di 1 Mbyte per ogni core, che però, essendo presenti due core, occupano un numero rilevante di transistor. La Cpu, infatti, utilizza 230 milioni di transistor distribuiti su 206 mm2. Classifica dei primi 6 supercomputer al mondo (2005), da http://www.top500.org/lists/2005/11/basic Rmax e Rpeak sono valori espressi in Gflops e indicano le perfomances . Processori Anno 1 2 3 4 5 6 BlueGene/L - eServer Blue Gene Solution IBM IBM Thomas J. Watson BGW - eServer Blue Research Center Gene Solution United States IBM ASC Purple - eServer DOE/NNSA/LLNL pSeries p5 575 1.9 United States GHz IBM Columbia - SGI Altix NASA/Ames Research 1.5 GHz, Voltaire Center/NAS Infiniband United States SGI Thunderbird Sandia National Laboratories PowerEdge 1850, 3.6 United States GHz, Infiniband Dell Red Storm Cray XT3, Sandia National Laboratories 2.0 GHz United States Cray Inc. DOE/NNSA/LLNL United States Pagina 20 di 30 Rmax Rpeak 131.072 2005 280600 367000 40.960 2005 91290 114688 10.240 2005 63390 77824 10.160 2004 51870 60960 8.000 2005 38270 64512 10.880 2005 36190 43520 Unità di Misura Byte (8 bit)- capacità di memorizzare dati Baud: deriva dall’ingegnere francese Jean Baudot che inventò il telegrafo verso la metà del secolo scorso. Numero dei cambiamenti di stato (impulsi) di un segnale in un secondo. Indica la velocità del modem Il numero di bit effettivamente scambiati in un secondo dipende dalla tecnica utilizzata per scambiare dati (modulazione di ampiezza, frequenza, fase). bps - velocità di trasmissione dati= bit per secondo kilobit per secondo (Kbps), megabit per secondo (Mbps), gigabit per secondo (Gbps), 103 bps 106 bps 109 bps Hertz - velocità nell’elaborare dati, oggi GH, Gigahertz MIPS: Indica il numero di istruzioni eseguite in un secondo da un microprocessore (Milioni di Istruzioni Per Secondo). DPI - risoluzione per periferiche di input ed output, ad es. stampanti, macchine fotografiche digitali, scanner, monitor. La risoluzione di una stampante indica il numero di punti che si possono stampare in un quadrato di 2.54 cm di lato(1 inch, pollice). Una stampante con risoluzione di 300DPI è in grado di stampare 90.000 punti in 6.4516 cm2 La risoluzione di uno scanner indica il numero di punti in cui verrà fotografata l’immagine in una linea di 2.54 cm Risoluzione orizzontale e verticale (es. 600x600 DPI) La risoluzione di un monitor è misurata in maniera differente dalla risoluzione di stampa. Tiene in considerazione la grandezza del monitor (15”, 17”, 19”, 21”) e del numero di pixel gestibile dal monitor e dalla scheda grafica. Grandezza del monitor misurata dalla lunghezza della diagonale Esempi di risoluzione (800x600, 1024x768) Con una risoluzione di 1024 x768 serve una Ram video da 768 K celle (768* 1024 byte celle). Negli LCD cristalli liquidi, ogni pixel e’ formato da una cella contenente un liquido che cambia colore in base al potenziale elettrico applicato. Pagina 21 di 30 Perché un byte = 8 bit? Per rappresentare i simboli usati nel nostro linguaggio: 52 lettere tra maiuscole e minuscole 10 cifre - 6 tipi di parentesi () [] {} 6 simboli di punteggiatura 7 simboli matematici + * / - > < = meno di altri 47 simboli …. @ _ \ ^ …. Multipli del byte Gigabyte – Gb, 1024 Mb Terabyte – Tb, 1024 Gb Petabyte – Pb, 1024 Tb = 230 byte » 1 miliardo di byte = 240 byte » 1000 miliardi di byte = 250 byte » 1 milione di miliardi di byte La Codifica dei Dati Ad ogni carattere (simbolo) dobbiamo assegnare una sequenza binaria. L’assegnazione simbolo « sequenza binaria dipende dal codice utilizzato • ASCII • EBCDIC • UNICODE Codice ASCII ASCII: American Standard Code for Information Interchange ASCII standard: rappresenta 128 simboli (7 bit), A « 65 « 01000001 ASCII esteso: rappresenta 256 simboli (8 bit), £ « 163« 10100011 Codice UNICODE UNICODE: UNIversal CODE Gestisce 34168 caratteri. Serve a rappresentare parole scritte in lingue quali: Ebraico, Cinese, Giapponese, Russo, …. I caratteri sono rappresentati da 16 bit Pagina 22 di 30 Automi a stati finiti Molti giochi per bambini seguono le seguenti regole: alcune pedine sono disposte su un tabellone, vengono tirati dei dadi ed il risultato indica e determina, senza possibilità di intervento da parte dei giocatori, il movimento di ogni pedina. Le differenti situazioni in cui possono venire a trovarsi le pedine sono dette stati, ed il gioco passa da uno stato ad un altro secondo regole determinate (in modo unico) dalla stringa di input definita dal lancio dei dadi. Dopo un certo numero di lanci dei dadi, il gioco perviene ad uno stato detto stato finale, che indica la vittoria di uno dei giocatori. E’ da notare che una volta assegnata la sequenza determinata dai tiri dei dadi, il meccanismo è totalmente deterministico, cioè non prevede alcuna possibilità di scelta da parte dei giocatori. Il più generale modello matematico che racchiude in sé tutte queste caratteristiche è l’automa a stati finiti (finito perché è tale il numero degli stati possibili, automa per indicare un oggetto che si muove da se). Un automa è un dispositivo astratto, utilizzato per realizzare delle computazioni. Gli automi sono utilizzati come modello nella progettazione di circuiti digitali, negli analizzatori lessicali di un compilatore, per la ricerca di parole chiave su file o (in maniera più estesa) sul web, o per software per la verifica di sistemi a stati finiti, come i protocolli di comunicazione. Sono così esempi di automi anche una lavatrice, un distributore automatico di bibite, un interruttore, una calcolatrice tascabile, Turing ha studiato e definito le macchine di Touring prima che esistessero i calcolatori. Le macchine di Touring possono essere idealmente rappresentate come computer astratti. Macchine di Touring: Una macchina di Touring (in seguito chiamata più semplicemente TM) è un automa a stati finiti con un nastro di lunghezza infinita su cui può leggere e scrivere. Una TM fa una mossa in funzione del suo stato e del simbolo sotto la testina di lettura. In una mossa, la TM cambia stato scrive un simbolo nel nastro muove la testina a destra {R} o a sinistra {L} Automi a stati finiti ed espressioni regolari Pagina 23 di 30 Un automa 1. 2. 3. 4. 5. a stati finiti è una quintupla formata da A=(Q, , , q0, F): insieme finito degli stati dell'automa alfabeto del linguaggio insieme delle transizioni di stato unico stato iniziale insieme finito di stati finali La tipologia più semplice di macchina per il riconoscimento di linguaggi, è costituita dai cosiddetti automi a stati finiti, o automi finiti. Questi automi si possono pensare come dispositivi che, mediante una testina di lettura, leggono la stringa di input scritta su di un nastro e la elaborano facendo uso di un "meccanismo" e di una memoria di lavoro limitata. L'elaborazione della stringa, avviene un carattere alla volta, mediante l'esecuzione di specifici passi computazionali: Lettura del carattere corrente della stringa. Spostamento della testina sul carattere successivo. Aggiornamento dello stato della memoria che viene sfruttato per tenere traccia di quanto letto, in base ad una funzione di transizione che ad ogni coppia < carattere letto, stato corrente > associa lo stato successivo. Inizialmente la memoria dell'automa si trovi nello stato iniziale q0, mentre dopo la lettura del primo carattere (a) della stringa e lo spostamento della testina di lettura sul carattere successivo, la memoria passi nello stato q1, fino ad arrivare poi nello stato q3 alla fine della elaborazione di tutta la stringa di input. Con il termine automa s’intende un qualunque dispositivo, un qualunque oggetto, che esegue da se stesso un particolare compito, sulla base degli stimoli od ordini ricevuti. Pagina 24 di 30 Sono così esempi di automi una lavatrice, un distributore automatico di bibite, un interruttore, una calcolatrice tascabile, è possibile studiare un automa da due punti di vista: da un punto di vista tecnico ci s’interessa dei suoi componenti materiali, meccanici o elettronici, e dei suoi principi fisici che ne rendono possibile il funzionamento; da un punto di vista matematico c'interessa invece la "logica" del suo comportamento e l’automa è perciò visto come un oggetto astratto "capace" di eseguire qualche compito. Ad esempio, due automi capaci di eseguire un’addizione sono l’automa uomo e l’automa calcolatrice, molto diversi da un punto di vista tecnico-fisico, ma che si comportano nello stesso modo di fronte a due numeri da addizionare. I grafi e le matrici sono due comportamento di un automa. modi, equivalenti, di rappresentare il Il grafo, chiamato diagramma degli stati, ha come nodi gli stati possibili dell’automa; gli archi rappresentano le relazioni di passaggio da uno stato all’altro, secondo il particolare input. La matrice, chiamata tabella di verità, è una tabella in cui ogni casella specifica qual è il successivo stato e l’output dell’automa se esso si trova in un determinato stato e riceve un certo input. Un distributore automatico di bevande dà una lattina quando s’inseriscono due monete da 20 euro. Quali sono gli input e gli output di quest'automa? Quali sono i possibili stati? Il diagrammi degli stati è il seguente: Nell’arco che va dallo stato di "in attesa" allo stato di "pronto" la scrittura "moneta/lattina" indica che, in corrispondenza dell’input "moneta" è fornito l’output "lattina". Come si vede, non sempre un automa fornisce un output. Pagina 25 di 30 La tabella di verità è la seguente: Input Stati SPENTO PRONTO IN ATTESA moneta SPENTO IN ATTESA PRONTO/lattina Gli stati di un automa rappresentano i suoi stati di memoria; un automa, infatti, si trova in uno o in un altro stato secondo ciò che è successo in precedenza. Secondo lo stato in cui si trova e dell’input che riceve, l’automa stabilisce il suo comportamento, passando in un nuovo stato ed eventualmente fornendo un output: (stato, input) (nuovo stato, output). I livelli di un computer Livello 0: livello della logica digitale, hardware; Livello 1: livello della microprogrammazione, firmware (è costituito dal software incorporato nei dispositivi elettronici durante la loro costruzione); Livello 2: livello del sistema operativo; Livello 3: livello del software. Pagina 26 di 30 Automi di Mealy e di Moore Gli automi a stati finiti sono una particolare categoria di dispositivi automatici facilmente realizzabili anche con le tecniche dell’elettronica digitale. Un automa si dice proprio, o di Moore, quando le uscite al tempo t dipendono esclusivamente dai valori assunti dello stato, in pratica: Ut = g (St) Per esempio un flip-flop è un automa di Moore di tipo sincrono, infatti, l’uscita può variare solo in sincronismo con il fronte attivo del clock. Un latch è invece di tipo asincrono perché la variazione dell’uscita avviene in corrispondenza di una variazione d’ingresso. Le reti combinatorie risolvono problemi in cui non è richiesto di ricordare la storia degli ingressi precedenti. Nel diagramma degli stati ogni nodo rappresenta una coppia s/u, ove s è lo stato ed u l’uscita in un certo istante, e ad ogni arco è associato il relativo ingresso. Un automa si dice improprio, o di Mealy, quando è caratterizzato dal fatto che l’uscita al tempo t, oltre che dallo stato, dipende anche dagli ingressi nello stesso istante, in pratica: Ut = g (St, it). Non si deve pensare che gli automi di Moore siano più limitati di quelli di Mealy rispetto alle cose che possono fare. Infatti, è sempre possibile trasformare ogni automa di Mealy nel corrispondente automa di Moore aumentando adeguatamente il numero degli stati. Le reti sequenziali e la macchina di Turing sono esempi di automi di Mealy. Nel diagramma degli stati ogni nodo rappresenta uno stato e ad ogni arco è associata una coppia i/U, dove i è l’ingresso che provoca il cambiamento di stato ed U è l’uscita che ne deriva. Dallo stato attuale Sp a quello futuro Sf a causa dell’ingresso Ip . Sì mette anche il valore di ingresso e quello di uscita U. Ip/Up Autonoma di Mealy Sp Sf Sp Ip Autonoma di Moore Pagina 27 di 30 Sp Sf,Uf Gli automi che esamineremo sono tutti automi con memoria limitata, e comunque finita poiché hanno un numero finito di stati: sono chiamati automi a stati finiti. Più precisamente definiamo automa a stati finiti un sistema dinamico, discreto ed invariante, in cui gli insiemi d’ingresso, di uscita e di stato sono finiti. Una classe di automi particolarmente importante è quella degli automi in grado di riconoscere se una stringa fa parte o meno di un determinato linguaggio: automi riconoscitori. Quando si scrive un programma in un linguaggio di programmazione, infatti, l’esecutore (compilatore e/o interprete), prima ancora di elaborare i dati eseguendo le istruzioni, deve verificare che nelle istruzioni impartite non ci sia alcun errore di sintassi. Gli automo riconoscitori, in pratica, sono sistemi che, dopo l’ingresso dell’ultimo simbolo della sequenza, rispondono con un "si" se questa è stata riconosciuta e con un "no" in caso contrario. In automi di questo tipo, nei diagrammi degli stati, è possibile riconoscere l’esistenza di almeno uno stato iniziale, caratterizzato dal fatto di non aver nessun arco in entrata, e uno stato finale, da cui invece non escono archi. Anche molti modelli astratti usati per rappresentare sistemi molto complessi come i sistemi economici, le reti di neuroni, i problemi d trasporto, e così via, possono essere agevolmente rappresentati attraverso delle tabelle di verità. Per descrivere un automa occorre un modello matematico formato dalla quintupla: A = í S, I, U, f, g dove: S è l’insieme degli stati interni in cui può trovarsi; I è l’insieme degli ingressi che è in grado di leggere; U è l’insieme delle uscite che può produrre; f è la funzione che fa passare da uno stato al successivo, St+1 = f (St, it); g è la funzione che determina il valore delle uscite, Ut = g (St, it). Pagina 28 di 30 Esempio di Automa finito di Moore I2 Inizio I1 I2 S1,U1 S2,U2 I1 Tabella Transizioni Stati Interni Ingresso I1 Ingresso I2 S1 S2 S1 S1 S2 S2 Tabella Uscite Stati Interni S1 S2 U1 U2 Se il sistema si trova nello stato S1 con associata l’uscita U1 passa nello stato S2 se viene fornito l’ingresso I2 mentre rimane in S1 finche’ arriva l’input I1. Rimane pure in S2/U2 finche’ arriva l’input I2, mentre effettua una transizione in S1 se arriva I1. In conclusione nell’automa di Mealy le uscite si verificano in concomitanza con le transizioni ed e’ quindi esplicita la dipendenza di esse anche dall’ingresso oltre allo stato. Mentre nell’automa di Moore le uscite si hanno in corrispondenza del permanere del sistema in uno stato e quindi dipendono esplicitamente solo da esso. Se si analizzasse il comportamento dell’automa Ascensore vista da un utente generico e da un tecnico troveremmo che l’utente vede l’automa ascensore come automa di Mealy mentre il tecnico lo vedrebbe come automa di Moore. Pagina 29 di 30 NOTE Pagina 30 di 30