Da un centinaio d’anni a questa parte, sembra quasi che ci sia una rivoluzione scientifica al giorno. Un po’ per le scoperte in fisica, un po’ per le innovazioni tecnologiche, sembra letteralmente che si siano aperte le porte del Paese dei Balocchi della scienza. C’è però una differenza sostanziale tra i progressi di oggi e quelli, diciamo, di una cinquantina d’anni fa: oggi, i progetti più importanti, di ricerca o di sviluppo che siano, li portano avanti gruppi di persone, non più singoli. Il motivo è sicuramente che fisica e ingegneria sono molto più complicate di cinquant’anni fa, e sono dure da affrontare da soli, ma un po’ dipende anche dal fatto che lavorare in gruppo permette di fare più cose in minor tempo e con minor fatica. Gli ingegneri (che non ci tengono a lavorare più del necessario) l’hanno capito da un pezzo: oggi vi presenteremo una carrellata di tutti i modi curiosi in cui il parallelismo permette ad un processore di fare più cose in minor tempo.
GIU’ PER IL TUBO - REPRISE
Una prima forma di parallelismo ve l’abbiamo già presentata un po’ di tempo fa, e si trattava della pipeline. L’idea lì era di dividere l’esecuzione in stadi indipendenti tra loro, separati da registri in modo tale che l’esecuzione in uno non fosse influenzata da ciò che accadeva in un altro (entro certi limiti). Se ricordate, la pipeline che vi avevamo presentato era quella classica a cinque stadi (Figura 1).
Diciamo “classica” perché si tratta di un tipo di pipeline in giro da un certo tempo, semplice, concettualmente elegante, e tutt’ora utilizzata in molti processori ARM e MIPS. Diciamo “classica” anche perché, per quanto vi possa essere sembrata complicata, c’è ancora molto, molto margine di miglioramento, ed in effetti i processori moderni la complicano in maniera quasi inverosimile nel tentativo di migliorare le prestazioni.
Prima possibilità di miglioramento: perché limitarsi a cinque stadi? In effetti, ci sono casi in cui l’aggiunta di stadi sembra naturale. Ricordate i moltiplicatori? Quella complicatissima (e lentissima) struttura a matrice? Un moltiplicatore senza pipeline è probabilmente uno dei circuiti meno efficienti che si possano immaginare. Anche lo shifter, con la sua struttura a cinque livelli in cascata, si prestava bene alla suddivisione in stadi. Il problema con la pipeline è che non si può andare avanti ad aggiungere stadi in eterno, un po’ perché non tutto può essere diviso in stadi (uno stadio di un moltiplicatore non può essere ulteriormente diviso in stadi), un po’ perché comunque anche l’aggiunta dei registri introduce overhead. Non dimenticate che comunque, affinché un registro funzioni, i dati devono rispettare certe temporizzazioni (devono essere pronti un po’ prima del nuovo fronte di clock e devono restare stabili per un po’ dopo che il fronte di clock è arrivato), altrimenti non verranno memorizzati, e questi sono tempi morti che comunque ci devono stare. Se aggiungete troppi registri, ad un certo punto i tempi morti saranno maggiori dei tempi di elaborazione, e renderanno poco conveniente l’aggiunta di altri stadi. A questi vanno aggiunte le complicazioni per gestire le sicuramente più numerose control e data hazard che si verificherebbero in una pipeline più lunga. Al giorno d’oggi, le pipeline più profonde hanno una quindicina di stadi. [...]
ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2978 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.
Un articolo molto avvincente e interessante. La tecnologia multicore presenta molti vantaggi nelle applicazioni di dispositivi a batteria grazie a una maggiore efficienza energetica rispetto ai sistemi multiprocessore e alle ottime performance raggiungibili.
Articolo molto interessante, complimenti. Le architetture dei processori di ultima generazione sono sempre più complesse e sofisticate, al punto che, per ottenere il migliore grado di ottimizzazione del codice, bisogna fidarsi ciecamente del compilatore. I CPU bug Meltdown e Spectre scoperti nel 2017 potevano essere evitati?
Ricordo i primi processori dei PC, l’8088 o l’8086 della Intel.
Erano estremamenti semplci, alcuni nemmeno dotati di coprocessore matematico.
Per abilitare il coprocessore si usava un emulatore software che “imbrogliava” il sistema e simulava la sua presenza.
In 30 anni si sono fatti enormi passi da gigante.