Unità centrale di elaborazione
Schema a blocchi di un computer CPU uniprocessore di base. Le linee nere indicano il flusso di dati, mentre le linee rosse indicano il flusso di controllo; le frecce indicano le direzioni del flusso.
Cablato in un circuito della CPU è un insieme di operazioni di base che può eseguire, chiamato un set di istruzioni. Tali operazioni possono comportare, ad esempio, l’aggiunta o la sottrazione di due numeri, il confronto di due numeri o il salto in una parte diversa di un programma., Ogni operazione di base è rappresentata da una particolare combinazione di bit, nota come codice operativo in linguaggio macchina; durante l’esecuzione delle istruzioni in un programma in linguaggio macchina, la CPU decide quale operazione eseguire “decodificando” l’opcode. Un’istruzione completa in linguaggio macchina consiste in un codice operativo e, in molti casi, bit aggiuntivi che specificano gli argomenti per l’operazione (ad esempio, i numeri da sommare nel caso di un’operazione di aggiunta). Salendo la scala di complessità, un programma in linguaggio macchina è una raccolta di istruzioni in linguaggio macchina che la CPU esegue.,
L’operazione matematica effettiva per ogni istruzione viene eseguita da un circuito logico combinatorio all’interno del processore della CPU noto come unità logica aritmetica o ALU. In generale, una CPU esegue un’istruzione recuperandola dalla memoria, utilizzando la sua ALU per eseguire un’operazione e quindi memorizzando il risultato in memoria., Oltre alle istruzioni per la matematica intera e le operazioni logiche, esistono varie altre istruzioni della macchina, come quelle per caricare i dati dalla memoria e memorizzarli, operazioni di ramificazione e operazioni matematiche su numeri in virgola mobile eseguite dall’unità in virgola mobile (FPU) della CPU.
Unità di controllomodifica
L’unità di controllo (CU) è un componente della CPU che dirige il funzionamento del processore., Dice memoria del computer, unità aritmetica e logica e dispositivi di input e output come rispondere alle istruzioni che sono state inviate al processore.
Dirige il funzionamento delle altre unità fornendo segnali di temporizzazione e controllo. La maggior parte delle risorse del computer sono gestite dal CU. Dirige il flusso di dati tra la CPU e gli altri dispositivi. John von Neumann incluse l’unità di controllo come parte dell’architettura von Neumann., Nei moderni progetti di computer, l’unità di controllo è tipicamente una parte interna della CPU con il suo ruolo generale e il funzionamento invariato dalla sua introduzione.
di logica Aritmetica unitEdit
rappresentazione Simbolica di una ALU e i suoi segnali di input e output
L’unità logica aritmetica (ALU) è un circuito digitale entro il processore che esegue l’intero aritmetica e bit per bit operazioni logiche., Gli ingressi all’ALU sono le parole di dati su cui operare (chiamati operandi), le informazioni sullo stato delle operazioni precedenti e un codice dell’unità di controllo che indica quale operazione eseguire. A seconda dell’istruzione che viene eseguita, gli operandi possono provenire da registri interni della CPU o da memoria esterna, oppure possono essere costanti generate dall’ALU stesso.
Quando tutti i segnali di ingresso si sono stabilizzati e propagati attraverso il circuito ALU, il risultato dell’operazione eseguita appare alle uscite ALU., Il risultato consiste sia in una parola di dati, che può essere memorizzata in un registro o in una memoria, sia in informazioni di stato che vengono tipicamente memorizzate in uno speciale registro interno della CPU riservato a questo scopo.
Address Generation unitEdit
Address Generation unit (AGU), a volte chiamata anche Address Computation Unit (ACU), è un’unità di esecuzione all’interno della CPU che calcola gli indirizzi utilizzati dalla CPU per accedere alla memoria principale., Avendo i calcoli degli indirizzi gestiti da circuiti separati che funzionano in parallelo con il resto della CPU, il numero di cicli della CPU necessari per l’esecuzione di varie istruzioni della macchina può essere ridotto, apportando miglioramenti alle prestazioni.
Durante l’esecuzione di varie operazioni, le CPU devono calcolare gli indirizzi di memoria necessari per il recupero dei dati dalla memoria; ad esempio, le posizioni in memoria degli elementi dell’array devono essere calcolate prima che la CPU possa recuperare i dati dalle posizioni di memoria effettive., Questi calcoli di generazione di indirizzi coinvolgono diverse operazioni aritmetiche intere, come addizioni, sottrazioni, operazioni modulo o spostamenti di bit. Spesso, il calcolo di un indirizzo di memoria comporta più di un’istruzione macchina di uso generale, che non necessariamente decodificare ed eseguire rapidamente. Incorporando un AGU in un progetto di CPU, insieme all’introduzione di istruzioni specializzate che utilizzano l’AGU, vari calcoli di generazione di indirizzi possono essere scaricati dal resto della CPU e spesso possono essere eseguiti rapidamente in un singolo ciclo di CPU.,
Le capacità di un’AGU dipendono da una particolare CPU e dalla sua architettura. Pertanto, alcune AGU implementano ed espongono più operazioni di calcolo degli indirizzi, mentre alcune includono anche istruzioni specializzate più avanzate che possono operare su più operandi alla volta. Inoltre, alcune architetture di CPU includono più AGU in modo che più di un’operazione di calcolo degli indirizzi possa essere eseguita contemporaneamente, apportando ulteriori miglioramenti delle prestazioni sfruttando la natura superscalare dei progetti di CPU avanzati., Ad esempio, Intel incorpora più AGU nelle sue microarchitetture Sandy Bridge e Haswell, che aumentano la larghezza di banda del sottosistema di memoria della CPU consentendo l’esecuzione parallela di più istruzioni di accesso alla memoria.
Memory Management unit (MMU)Modifica
La maggior parte dei microprocessori di fascia alta (nei computer desktop, laptop, server) ha un’unità di gestione della memoria, che traduce gli indirizzi logici in indirizzi RAM fisici, fornendo protezione della memoria e capacità di paging, utili per la memoria virtuale., Processori più semplici, soprattutto microcontrollori, di solito non includono una MMU.
CacheEdit
Una cache CPU è una cache hardware utilizzata dall’unità di elaborazione centrale (CPU) di un computer per ridurre il costo medio (tempo o energia) per accedere ai dati dalla memoria principale. Una cache è una memoria più piccola, più veloce, più vicina al core del processore, che memorizza copie dei dati dalle posizioni di memoria principali utilizzate di frequente. La maggior parte delle CPU ha diverse cache indipendenti, incluse le cache di istruzioni e dati, dove la cache dei dati è solitamente organizzata come una gerarchia di più livelli di cache (L1, L2, L3, L4, ecc.,).
Tutte le CPU moderne (veloci) (con poche eccezioni specializzate) hanno più livelli di cache della CPU. Le prime CPU che utilizzavano una cache avevano un solo livello di cache; a differenza delle successive cache di livello 1, non era divisa in L1d (per i dati) e L1i (per le istruzioni). Quasi tutte le CPU attuali con cache hanno una cache L1 divisa. Hanno anche cache L2 e, per processori più grandi, cache L3 pure. La cache L2 di solito non è divisa e agisce come un repository comune per la cache L1 già divisa. Ogni core di un processore multi-core ha una cache L2 dedicata e di solito non è condivisa tra i core., La cache L3 e le cache di livello superiore sono condivise tra i core e non sono divise. Una cache L4 è attualmente rara, ed è generalmente su memoria dinamica ad accesso casuale (DRAM), piuttosto che su memoria statica ad accesso casuale (SRAM), su un dado o chip separato. Questo è stato anche il caso storicamente con L1, mentre i chip più grandi hanno permesso l’integrazione di esso e in generale tutti i livelli di cache, con la possibile eccezione dell’ultimo livello. Ogni livello extra di cache tende ad essere più grande e ottimizzato in modo diverso.,
Esistono altri tipi di cache (che non sono conteggiati per la “dimensione della cache” delle cache più importanti menzionate sopra), come il translation lookaside buffer (TLB) che fa parte della Memory Management unit (MMU) che la maggior parte delle CPU ha.
Le cache sono generalmente dimensionate in potenze di due: 4, 8, 16 ecc. KiB o MiB (per dimensioni non L1 più grandi), sebbene IBM z13 abbia una cache di istruzioni L1 da 96 KiB.
Clock rateEdit
La maggior parte delle CPU sono circuiti sincroni, il che significa che impiegano un segnale di clock per accelerare le loro operazioni sequenziali., Il segnale di clock è prodotto da un circuito oscillatore esterno che genera un numero costante di impulsi ogni secondo sotto forma di un’onda quadra periodica. La frequenza degli impulsi di clock determina la velocità con cui una CPU esegue le istruzioni e, di conseguenza, più veloce è l’orologio, più istruzioni la CPU eseguirà ogni secondo.
Per garantire il corretto funzionamento della CPU, il periodo di clock è più lungo del tempo massimo necessario affinché tutti i segnali si propaghino (si muovano) attraverso la CPU., Impostando il periodo di clock su un valore ben al di sopra del ritardo di propagazione del caso peggiore, è possibile progettare l’intera CPU e il modo in cui sposta i dati attorno ai “bordi” del segnale di clock in salita e in discesa. Questo ha il vantaggio di semplificare la CPU in modo significativo, sia dal punto di vista del design che dal punto di vista del conteggio dei componenti. Tuttavia, porta anche lo svantaggio che l’intera CPU deve attendere i suoi elementi più lenti, anche se alcune parti di esso sono molto più veloci. Questa limitazione è stata ampiamente compensata da vari metodi di aumento del parallelismo della CPU (vedi sotto).,
Tuttavia, i miglioramenti architettonici da soli non risolvono tutti gli inconvenienti delle CPU sincrone a livello globale. Ad esempio, un segnale di clock è soggetto ai ritardi di qualsiasi altro segnale elettrico. Frequenze di clock più elevate in CPU sempre più complesse rendono più difficile mantenere il segnale di clock in fase (sincronizzato) su tutta l’unità. Questo ha portato molte CPU moderne a richiedere più segnali di clock identici da fornire per evitare di ritardare un singolo segnale in modo significativo sufficiente a causare il malfunzionamento della CPU., Un altro problema importante, come tassi di clock aumentano drasticamente, è la quantità di calore che viene dissipata dalla CPU. L’orologio in continua evoluzione fa sì che molti componenti cambino indipendentemente dal fatto che vengano utilizzati in quel momento. In generale, un componente che sta cambiando utilizza più energia di un elemento in uno stato statico. Pertanto, con l’aumentare della frequenza di clock, aumenta anche il consumo di energia, causando la dissipazione del calore della CPU sotto forma di soluzioni di raffreddamento della CPU.,
Un metodo per gestire la commutazione di componenti non necessari è chiamato clock gating, che comporta lo spegnimento del segnale di clock a componenti non necessari (disabilitandoli efficacemente). Tuttavia, questo è spesso considerato difficile da implementare e quindi non vede l’uso comune al di fuori di progetti a bassissima potenza. Un notevole design recente della CPU che utilizza un ampio gating di clock è lo Xeno basato su IBM PowerPC utilizzato in Xbox 360; in questo modo, i requisiti di alimentazione di Xbox 360 sono notevolmente ridotti., Un altro metodo per affrontare alcuni dei problemi con un segnale di clock globale è la rimozione del segnale di clock del tutto. Mentre la rimozione del segnale di clock globale rende il processo di progettazione considerevolmente più complesso in molti modi, i progetti asincroni (o senza orologio) presentano notevoli vantaggi in termini di consumo energetico e dissipazione del calore rispetto a progetti sincroni simili. Mentre un po ‘ raro, intere CPU asincrone sono state costruite senza utilizzare un segnale di clock globale. Due esempi notevoli di questo sono il braccio compatibile AMULET e il MIPS R3000 compatibile MiniMIPS.,
Invece di rimuovere completamente il segnale di clock, alcuni progetti di CPU consentono a determinate parti del dispositivo di essere asincrone, come l’utilizzo di ALU asincrone in combinazione con pipelining superscalare per ottenere alcuni guadagni aritmetici delle prestazioni. Anche se non è del tutto chiaro se i progetti totalmente asincroni possano funzionare a un livello comparabile o migliore rispetto alle loro controparti sincrone, è evidente che eccellono almeno in operazioni matematiche più semplici., Questo, combinato con le loro eccellenti proprietà di consumo energetico e dissipazione del calore, li rende molto adatti per computer embedded.
Voltage regulator moduleEdit
Molte CPU moderne hanno un modulo di gestione della potenza integrato che regola l’alimentazione di tensione on-demand ai circuiti della CPU consentendo di mantenere l’equilibrio tra prestazioni e consumo energetico.
Intervallo integeredit
Ogni CPU rappresenta i valori numerici in un modo specifico., Ad esempio, alcuni primi computer digitali rappresentavano numeri come valori di sistema numerali decimali familiari (base 10), e altri hanno impiegato rappresentazioni più insolite come ternario (base tre). Quasi tutte le CPU moderne rappresentano numeri in forma binaria, con ogni cifra rappresentata da una quantità fisica a due valori come una tensione” alta “o” bassa”.
Una parola a sei bit contenente la rappresentazione codificata binaria del valore decimale 40. La maggior parte delle CPU moderne impiegano dimensioni di parole che sono una potenza di due, ad esempio 8, 16, 32 o 64 bit.,
Relativo alla rappresentazione numerica è la dimensione e la precisione dei numeri interi che una CPU può rappresentare. Nel caso di una CPU binaria, questo viene misurato dal numero di bit (cifre significative di un intero codificato binario) che la CPU può elaborare in un’unica operazione, che viene comunemente chiamata dimensione parola, larghezza bit, larghezza percorso dati, precisione intera o dimensione intera. La dimensione intera di una CPU determina l’intervallo di valori interi su cui può operare direttamente., Ad esempio, una CPU a 8 bit può manipolare direttamente interi rappresentati da otto bit, che hanno un intervallo di 256 (28) valori interi discreti.
L’intervallo intero può anche influenzare il numero di posizioni di memoria che la CPU può indirizzare direttamente (un indirizzo è un valore intero che rappresenta una posizione di memoria specifica). Ad esempio, se una CPU binaria utilizza 32 bit per rappresentare un indirizzo di memoria, può indirizzare direttamente 232 posizioni di memoria. Per aggirare questa limitazione e per vari altri motivi, alcune CPU utilizzano meccanismi (come il bank switching) che consentono di indirizzare la memoria aggiuntiva.,
Le CPU con dimensioni di parole più grandi richiedono più circuiti e di conseguenza sono fisicamente più grandi, costano di più e consumano più energia (e quindi generano più calore). Di conseguenza, microcontrollori più piccoli a 4 o 8 bit sono comunemente usati nelle applicazioni moderne anche se sono disponibili CPU con dimensioni di parole molto più grandi (come 16, 32, 64, persino 128 bit). Quando sono richieste prestazioni più elevate, tuttavia, i vantaggi di una dimensione delle parole più grande (intervalli di dati più grandi e spazi di indirizzi) possono superare gli svantaggi. Una CPU può avere percorsi di dati interni più brevi della dimensione della parola per ridurre dimensioni e costi., Per esempio, anche se l’IBM System/360 set di istruzioni è un 32-bit del set di istruzioni, il Sistema/360 Modello 30 e il Modello 40 aveva dati a 8 bit percorsi nell’aritmetica unità logica, in modo che un 32-bit di aggiungere quattro cicli, uno per ogni 8 bit degli operandi, e, anche se il Motorola 68000 serie di set di istruzioni è un 32-bit del set di istruzioni, il Motorola 68000 Motorola 68010 aveva dati a 16 bit percorsi nell’aritmetica unità logica, in modo che un 32-bit di aggiungere due cicli.,
Per ottenere alcuni dei vantaggi offerti da lunghezze di bit inferiori e superiori, molti set di istruzioni hanno larghezze di bit diverse per dati interi e in virgola mobile, consentendo alle CPU che implementano quel set di istruzioni di avere larghezze di bit diverse per diverse parti del dispositivo. Ad esempio, il set di istruzioni IBM System/360 era principalmente a 32 bit, ma supportava valori in virgola mobile a 64 bit per facilitare una maggiore precisione e intervallo nei numeri in virgola mobile., Il System / 360 Model 65 aveva un sommatore a 8 bit per l’aritmetica binaria decimale e a virgola fissa e un sommatore a 60 bit per l’aritmetica a virgola mobile. Molti progetti di CPU successivi utilizzano una larghezza di bit mista simile, specialmente quando il processore è pensato per un uso generico in cui è richiesto un ragionevole equilibrio tra capacità intera e virgola mobile.,
ParallelismEdit
Modello di subscalar CPU, in cui prende quindici cicli di clock per completare tre istruzioni
La descrizione del funzionamento di base di una CPU offerto nella precedente sezione descrive la forma più semplice che una CPU può assumere. Questo tipo di CPU, solitamente indicato come subscalar, opera ed esegue un’istruzione su uno o due pezzi di dati alla volta, ovvero meno di un’istruzione per ciclo di clock (IPC < 1).,
Questo processo dà origine a un’inefficienza intrinseca nelle CPU sottoscalari. Poiché viene eseguita una sola istruzione alla volta, l’intera CPU deve attendere il completamento di tale istruzione prima di procedere all’istruzione successiva. Di conseguenza, la CPU subscalare viene “bloccata” su istruzioni che richiedono più di un ciclo di clock per completare l’esecuzione. Anche l’aggiunta di una seconda unità di esecuzione (vedi sotto) non migliora molto le prestazioni; piuttosto che un percorso appeso, ora due percorsi sono appesi e il numero di transistor inutilizzati è aumentato., Questo design, in cui le risorse di esecuzione della CPU possono operare su una sola istruzione alla volta, può raggiungere solo prestazioni scalari (un’istruzione per ciclo di clock, IPC = 1). Tuttavia, le prestazioni sono quasi sempre subscalar (meno di un’istruzione per ciclo di clock, IPC < 1).
I tentativi di ottenere prestazioni scalari e migliori hanno portato a una varietà di metodologie di progettazione che fanno sì che la CPU si comporti in modo meno lineare e più parallelo., Quando si fa riferimento al parallelismo della Cpu, i due termini sono generalmente utilizzati per classificare queste tecniche di progettazione:
- istruzione-level parallelism (ILP), che cerca di aumentare la velocità con cui le istruzioni vengono eseguite all’interno di una CPU (che è, per aumentare l’uso di on-die risorse di esecuzione);
- a livello di attività di parallelismo (TLP), che fini per aumentare il numero di thread o processi che una CPU può eseguire contemporaneamente.,
Ogni metodologia differisce sia nei modi in cui sono implementate, sia nell’efficacia relativa che permettono di aumentare le prestazioni della CPU per un’applicazione.
Parallelismo a livello di istruzionemodifica
Pipeline di base a cinque stadi. Nel migliore dei casi, questa pipeline può sostenere una velocità di completamento di un’istruzione per ciclo di clock.,
Uno dei metodi più semplici utilizzati per ottenere un parallelismo maggiore è iniziare i primi passi del recupero e della decodifica delle istruzioni prima che l’istruzione precedente finisca di essere eseguita. Questa è la forma più semplice di una tecnica nota come instruction pipelining, ed è utilizzata in quasi tutte le moderne CPU general-purpose. Il pipelining consente di eseguire più di un’istruzione in un dato momento suddividendo il percorso di esecuzione in fasi discrete., Questa separazione può essere paragonata a una linea di assemblaggio, in cui un’istruzione viene resa più completa in ogni fase fino a quando non esce dalla pipeline di esecuzione e viene ritirata.
Il pipelining, tuttavia, introduce la possibilità di una situazione in cui è necessario il risultato dell’operazione precedente per completare l’operazione successiva; una condizione spesso definita conflitto di dipendenza dai dati. Per far fronte a questo, è necessario prestare ulteriore attenzione per verificare questo tipo di condizioni e ritardare una parte della pipeline di istruzioni se ciò si verifica., Naturalmente, per ottenere ciò è necessaria una circuiteria aggiuntiva, quindi i processori pipeline sono più complessi di quelli subscalari (anche se non in modo molto significativo). Un processore pipeline può diventare quasi scalare, inibito solo da bancarelle di pipeline (un’istruzione che spende più di un ciclo di clock in una fase).
Una semplice pipeline superscalare. Recuperando e spedendo due istruzioni alla volta, è possibile completare un massimo di due istruzioni per ciclo di clock.,
Un ulteriore miglioramento dell’idea di instruction pipelining ha portato allo sviluppo di un metodo che riduce ulteriormente il tempo di inattività dei componenti della CPU. I progetti che si dice siano superscalari includono una pipeline di istruzioni lunga e più unità di esecuzione identiche, come unità di caricamento, unità logiche aritmetiche, unità in virgola mobile e unità di generazione di indirizzi. In una pipeline superscalare, più istruzioni vengono lette e passate a un dispatcher, che decide se le istruzioni possono essere eseguite in parallelo (contemporaneamente)., In tal caso vengono inviati alle unità di esecuzione disponibili, con conseguente possibilità di eseguire più istruzioni contemporaneamente. In generale, più istruzioni una CPU superscalare è in grado di inviare simultaneamente alle unità di esecuzione in attesa, più istruzioni saranno completate in un dato ciclo.
La maggior parte delle difficoltà nella progettazione di un’architettura CPU superscalare risiede nella creazione di un dispatcher efficace., Il dispatcher deve essere in grado di determinare rapidamente e correttamente se le istruzioni possono essere eseguite in parallelo, nonché di inviarle in modo tale da mantenere occupato il maggior numero possibile di unità di esecuzione. Ciò richiede che la pipeline di istruzioni sia riempita il più spesso possibile e dia luogo alla necessità nelle architetture superscalari di quantità significative di cache della CPU. Rende anche tecniche di prevenzione dei pericoli come la previsione delle filiali, l’esecuzione speculativa, la ridenominazione dei registri, l’esecuzione fuori ordine e la memoria transazionale cruciali per mantenere alti livelli di prestazioni., Tentando di prevedere quale ramo (o percorso) prenderà un’istruzione condizionale, la CPU può ridurre al minimo il numero di volte in cui l’intera pipeline deve attendere fino al completamento di un’istruzione condizionale. L’esecuzione speculativa spesso fornisce un modesto aumento delle prestazioni eseguendo porzioni di codice che potrebbero non essere necessarie dopo il completamento di un’operazione condizionale. L’esecuzione fuori ordine riorganizza in qualche modo l’ordine in cui vengono eseguite le istruzioni per ridurre i ritardi dovuti alle dipendenze dei dati., Anche in caso di flusso di istruzioni singole, flusso di dati multipli—un caso in cui molti dati dello stesso tipo devono essere elaborati—, i moderni processori possono disabilitare parti della pipeline in modo che quando una singola istruzione viene eseguita molte volte, la CPU salta le fasi di recupero e decodifica e quindi aumenta notevolmente le prestazioni in determinate occasioni, specialmente in motori di programmi altamente monotoni come il software di creazione video e l’elaborazione di foto.,
Nel caso in cui una parte della CPU sia superscalare e una parte non lo sia, la parte che non lo è subisce una penalizzazione delle prestazioni a causa delle bancarelle di pianificazione. L’Intel P5 Pentium aveva due ALU superscalari che potevano accettare un’istruzione per ciclo di clock ciascuna, ma la sua FPU non poteva accettare un’istruzione per ciclo di clock. Quindi il P5 era superscalare intero ma non superscalare in virgola mobile. Successore di Intel per l ” architettura P5, P6, capacità superscalari aggiunto alle sue caratteristiche in virgola mobile, e quindi offerto un significativo aumento delle prestazioni delle istruzioni in virgola mobile.,
Sia il pipelining semplice che il design superscalare aumentano ILP di una CPU consentendo a un singolo processore di completare l’esecuzione di istruzioni a velocità superiori a un’istruzione per ciclo di clock. La maggior parte dei moderni progetti di CPU sono almeno un po ‘ superscalari, e quasi tutte le CPU general purpose progettate nell’ultimo decennio sono superscalari. Negli anni successivi parte dell “enfasi nella progettazione di computer ad alta ILP è stato spostato fuori dell”hardware della CPU e nella sua interfaccia software, o instruction set architecture (ISA)., La strategia di very long instruction word (VLIW) fa sì che alcuni ILP diventino impliciti direttamente dal software, riducendo la quantità di lavoro che la CPU deve eseguire per aumentare ILP e riducendo così la complessità del progetto.
Parallelismo a livello di attivitàmodifica
Un’altra strategia per ottenere prestazioni consiste nell’eseguire più thread o processi in parallelo. Questa area di ricerca è conosciuta come calcolo parallelo. Nella tassonomia di Flynn, questa strategia è conosciuta come multiple instruction stream, multiple data stream (MIMD).,
Una tecnologia utilizzata per questo scopo era multiprocessing (MP). Il sapore iniziale di questa tecnologia è noto come symmetric multiprocessing (SMP), dove un piccolo numero di CPU condividono una visione coerente del loro sistema di memoria. In questo schema, ogni CPU ha hardware aggiuntivo per mantenere una visualizzazione costantemente aggiornata della memoria. Evitando viste obsolete della memoria, le CPU possono cooperare sullo stesso programma e i programmi possono migrare da una CPU all’altra., Per aumentare il numero di CPU cooperanti oltre una manciata, schemi come non-uniform Memory access (NUMA) e protocolli di coerenza basati su directory sono stati introdotti negli 1990. I sistemi SMP sono limitati a un piccolo numero di CPU mentre i sistemi NUMA sono stati costruiti con migliaia di processori. Inizialmente, multiprocessing è stato costruito utilizzando più CPU discrete e schede per implementare l’interconnessione tra i processori., Quando i processori e la loro interconnessione sono tutti implementati su un singolo chip, la tecnologia è nota come multiprocessing a livello di chip (CMP) e il singolo chip come processore multi-core.
In seguito è stato riconosciuto che il parallelismo a grana più fine esisteva con un singolo programma. Un singolo programma potrebbe avere diversi thread (o funzioni) che potrebbero essere eseguiti separatamente o in parallelo. Alcuni dei primi esempi di questa tecnologia implementavano l’elaborazione di input / output come l’accesso diretto alla memoria come thread separato dal thread di calcolo., Un approccio più generale a questa tecnologia è stato introdotto nel 1970 quando i sistemi sono stati progettati per eseguire più thread di calcolo in parallelo. Questa tecnologia è conosciuta come multi-threading (MT). Questo approccio è considerato più economico del multiprocessing, poiché solo un piccolo numero di componenti all’interno di una CPU viene replicato per supportare MT rispetto all’intera CPU nel caso di MP. In MT, le unità di esecuzione e il sistema di memoria incluse le cache sono condivisi tra più thread., Lo svantaggio di MT è che il supporto hardware per il multithreading è più visibile al software rispetto a quello di MP e quindi il software supervisore come i sistemi operativi deve subire modifiche più grandi per supportare MT. Un tipo di MT implementato è noto come multithreading temporale, in cui un thread viene eseguito fino a quando non viene bloccato in attesa che i dati tornino dalla memoria esterna. In questo schema, la CPU passa rapidamente a un altro thread pronto per l’esecuzione, lo switch viene spesso eseguito in un ciclo di clock della CPU, come UltraSPARC T1., Un altro tipo di MT è il multithreading simultaneo, in cui le istruzioni da più thread vengono eseguite in parallelo all’interno di un ciclo di clock della CPU.
Per diversi decenni dagli 1970 ai primi 2000, l’attenzione nella progettazione di CPU general purpose ad alte prestazioni era in gran parte sul raggiungimento di un elevato ILP attraverso tecnologie come pipelining, cache, esecuzione superscalare, esecuzione fuori ordine, ecc. Questa tendenza è culminata in grandi CPU assetate di potere come l’Intel Pentium 4., Nei primi anni 2000, i progettisti di CPU sono stati ostacolati dal raggiungimento di prestazioni più elevate dalle tecniche ILP a causa della crescente disparità tra le frequenze operative della CPU e le frequenze operative della memoria principale, nonché l’escalation della dissipazione della potenza della CPU a causa di tecniche ILP più esoteriche.
I progettisti di CPU hanno quindi preso in prestito idee dai mercati di calcolo commerciale come l’elaborazione delle transazioni, in cui le prestazioni aggregate di più programmi, noto anche come throughput computing, erano più importanti delle prestazioni di un singolo thread o processo.,
Questa inversione di enfasi è evidenziata dalla proliferazione di design dual e più core del processore e, in particolare, i nuovi progetti di Intel che assomigliano alla sua architettura P6 meno superscalare. I progetti tardivi in diverse famiglie di processori mostrano CMP, tra cui l’x86-64 Opteron e Athlon 64 X2, lo SPARC UltraSPARC T1, IBM POWER4 e POWER5, oltre a diverse CPU per console per videogiochi come il design PowerPC triple-core di Xbox 360 e il microprocessore a celle 7-core di PlayStation 3.,
Data parallelismEdit
Un paradigma meno comune ma sempre più importante dei processori (e in effetti, l’informatica in generale) si occupa del parallelismo dei dati. I processori discussi in precedenza sono tutti indicati come un tipo di dispositivo scalare. Come suggerisce il nome, i processori vettoriali trattano più pezzi di dati nel contesto di un’istruzione. Ciò contrasta con i processori scalari, che si occupano di un dato per ogni istruzione., Usando la tassonomia di Flynn, questi due schemi di gestione dei dati sono generalmente indicati come single Instruction stream, Multiple Data stream (SIMD) e single Instruction stream, single data stream (SISD), rispettivamente. La grande utilità nella creazione di processori che si occupano di vettori di dati sta nell’ottimizzare le attività che tendono a richiedere la stessa operazione (ad esempio, una somma o un prodotto punto) da eseguire su un ampio set di dati. Alcuni esempi classici di questi tipi di attività includono applicazioni multimediali (immagini, video e audio), nonché molti tipi di attività scientifiche e ingegneristiche., Mentre un processore scalare deve completare l’intero processo di recupero, decodifica ed esecuzione di ogni istruzione e valore in un insieme di dati, un processore vettoriale può eseguire una singola operazione su un insieme di dati relativamente grande con un’istruzione. Ciò è possibile solo quando l’applicazione tende a richiedere molti passaggi che applicano un’operazione a un ampio set di dati.
La maggior parte dei primi processori vettoriali, come il Cray-1, erano associati quasi esclusivamente alla ricerca scientifica e alle applicazioni di crittografia., Tuttavia, poiché la multimedialità si è in gran parte spostata sui media digitali, la necessità di una qualche forma di SIMD nei processori general-purpose è diventata significativa. Poco dopo l’inclusione di unità in virgola mobile ha iniziato a diventare un luogo comune nei processori general-purpose, le specifiche e le implementazioni di unità di esecuzione SIMD cominciarono ad apparire anche per i processori general-purpose. Alcune di queste prime specifiche SIMD-come HP “s Multimedia Acceleration eXtensions (MAX) e Intel”s MMX – erano integer-only., Questo si è rivelato un ostacolo significativo per alcuni sviluppatori di software, dal momento che molte delle applicazioni che beneficiano di SIMD riguardano principalmente numeri in virgola mobile. Progressivamente, gli sviluppatori hanno perfezionato e rifatto questi primi progetti in alcune delle comuni specifiche SIMD moderne, che di solito sono associate all’architettura di un set di istruzioni (ISA). Alcuni esempi moderni notevoli includono Intel ” s Streaming SIMD Extensions (SSE) e il PowerPC-related AltiVec (noto anche come VMX).