TORIma Accademia Logo TORIma Accademia
Unità centrale di elaborazione (Central processing unit)
Tecnologia

Unità centrale di elaborazione (Central processing unit)

TORIma Accademia — Hardware informatico

Central processing unit

Unità centrale di elaborazione (Central processing unit)

Un'unità di elaborazione centrale (CPU), nota anche come processore centrale, processore principale o semplicemente processore, è il processore principale di un determinato computer. Suo…

L'unità di elaborazione centrale (CPU), chiamata anche processore centrale, processore principale o semplicemente processore, funziona come il processore principale all'interno di un sistema informatico. I suoi circuiti elettronici sono responsabili dell'esecuzione di istruzioni da un programma per computer, che comprendono operazioni aritmetiche, logiche, di controllo e di input/output (I/O). Questa funzione distingue la CPU da elementi esterni come la memoria principale e i circuiti I/O, nonché da coprocessori specializzati come le unità di elaborazione grafica (GPU).

Sebbene la forma, il design e l'implementazione delle unità di elaborazione centrale si siano evoluti in modo significativo, i loro principi operativi fondamentali sono ampiamente persistiti. I componenti chiave di una CPU comprendono l'unità aritmetico-logica (ALU), che esegue operazioni aritmetiche e logiche; registri del processore, che forniscono operandi all'ALU e conservano i risultati dell'operazione; e un'unità di controllo, che gestisce il recupero, la decodifica e l'esecuzione delle istruzioni coordinando l'ALU, i registri e altri componenti interni. Le CPU attuali allocano uno spazio sostanziale nei semiconduttori alle cache e al parallelismo a livello di istruzione per migliorare le prestazioni e alle modalità CPU per supportare i sistemi operativi e le funzionalità di virtualizzazione.

La maggior parte delle CPU attuali sono fabbricate come microprocessori a circuito integrato (IC), in cui una o più CPU risiedono su un singolo chip IC. I chip microprocessore che incorporano più CPU sono designati come processori multi-core (MCP). Queste distinte CPU fisiche, chiamate core del processore, sono anche in grado di eseguire il multithreading per facilitare il multithreading a livello di CPU.

Un circuito integrato (IC) che ospita una CPU può inoltre incorporare memoria, interfacce periferiche e altri componenti del computer. Tali dispositivi integrati sono comunemente chiamati microcontrollori o sistemi su chip (SoC).

Storia

Le prime macchine informatiche, esemplificate dall'ENIAC, necessitavano di un ricablaggio fisico per ogni compito distinto, portando alla loro classificazione come "computer a programma fisso". La designazione "unità di elaborazione centrale" è stata documentata in uso almeno dal 1955. Dato che "CPU" è tipicamente definito come un meccanismo per l'esecuzione di software (programmi per computer), i primi dispositivi giustamente chiamati CPU sono emersi contemporaneamente allo sviluppo del computer a programma memorizzato.

Il concetto di computer a programma memorizzato era già inerente al progetto dell'ENIAC di John Presper Eckert e John William Mauchly, sebbene inizialmente fosse escluso accelerare il completamento. Il 30 giugno 1945, prima della costruzione dell'ENIAC, il matematico John von Neumann fece circolare un documento intitolato Prima bozza di un rapporto sull'EDVAC. Questo articolo descriveva in dettaglio l'architettura di un computer a programma memorizzato, che fu successivamente finalizzato nell'agosto 1949. L'EDVAC fu progettato per eseguire un insieme predefinito di diverse istruzioni o operazioni. Fondamentalmente, i programmi per l'EDVAC dovevano risiedere nella memoria del computer ad alta velocità, piuttosto che essere dettati dal cablaggio fisico della macchina. Questa innovazione ha risolto uno svantaggio significativo dell'ENIAC, vale a dire il tempo e gli sforzi sostanziali necessari per riconfigurarlo per nuovi compiti. Il design di Von Neumann ha consentito la modifica del programma per l'EDVAC semplicemente alterando il contenuto della memoria. Tuttavia, EDVAC non è stato il pioniere dei computer a programma memorizzato; il Manchester Baby, un computer sperimentale a programma memorizzato su piccola scala, eseguì il suo programma iniziale il 21 giugno 1948, seguito dal Manchester Mark 1, che eseguì il suo primo programma nella notte tra il 16 e il 17 giugno 1949.

Inizialmente, le CPU erano componenti progettati su misura e integrati in sistemi informatici più grandi, spesso unici. Tuttavia, questo approccio di sviluppo di CPU su misura per applicazioni specifiche è stato ampiamente superato dalla produzione di massa di processori multiuso. Questa tendenza verso la standardizzazione è iniziata durante l'era dei mainframe e dei minicomputer a transistor discreti e si è notevolmente intensificata con l'adozione diffusa del circuito integrato (IC). L'IC ha facilitato la progettazione e la fabbricazione di CPU progressivamente complesse con tolleranze su scala nanometrica. Gli effetti combinati della miniaturizzazione e della standardizzazione della CPU hanno ampliato notevolmente l’ubiquità dei dispositivi digitali nella società contemporanea, estendendosi ben oltre l’ambito ristretto dei macchinari informatici specializzati. I moderni microprocessori si trovano ora in un'ampia gamma di dispositivi elettronici, dalle automobili e dai cellulari agli articoli ricreativi come i giocattoli.

Sebbene John von Neumann sia ampiamente riconosciuto per aver concepito il computer a programma memorizzato attraverso il suo progetto EDVAC, che in seguito divenne noto come architettura von Neumann, innovatori precedenti come Konrad Zuse avevano proposto e realizzato concetti comparabili. Anche l'Harvard Mark I, completato prima dell'EDVAC, utilizzava un'architettura a programma memorizzato, denominata architettura Harvard, che utilizzava nastro di carta perforato invece della memoria elettronica. Una distinzione fondamentale tra queste due architetture risiede nella separazione dell'archiviazione e dell'elaborazione delle istruzioni e dei dati della CPU da parte dell'architettura di Harvard, in contrasto con l'uso da parte dell'architettura von Neumann di uno spazio di memoria unificato per entrambi. Mentre la maggior parte delle CPU contemporanee aderisce prevalentemente al design von Neumann, prevalgono anche le CPU con architettura Harvard, in particolare nei sistemi embedded, esemplificati dai microcontrollori Atmel AVR.

Prima dell'avvento del transistor, relè e tubi a vuoto (noti anche come tubi termoionici) servivano come elementi di commutazione primari nei computer, con sistemi funzionali che richiedevano migliaia o decine di migliaia di tali dispositivi. Le prestazioni del sistema erano direttamente correlate alla velocità operativa di questi switch. I computer a tubi a vuoto, come l'EDVAC, in genere subivano guasti circa ogni otto ore, mentre i computer basati su relè, come il più lento ma precedente Harvard Mark I, dimostravano un'affidabilità significativamente più elevata. Alla fine, le unità di elaborazione centrale (CPU) basate su tubi hanno acquisito importanza perché i loro sostanziali vantaggi in termini di velocità hanno generalmente superato i problemi di affidabilità intrinseci. La maggior parte di queste prime CPU sincrone funzionava a frequenze di clock considerevolmente inferiori rispetto ai moderni progetti microelettronici, con frequenze tipiche del segnale di clock che andavano da 100 kHz a 4 MHz, vincolate principalmente dalle limitazioni di velocità dei dispositivi di commutazione che le compongono.

Unità di elaborazione centrale basate su transistor

La complessità dell'architettura delle unità di elaborazione centrale (CPU) è progressivamente aumentata man mano che i progressi tecnologici hanno consentito la creazione di componenti elettronici più compatti e affidabili. Uno sviluppo fondamentale in questa traiettoria è stata l’introduzione del transistor. Le CPU transistorizzate, emerse negli anni '50 e '60, hanno eliminato la necessità di elementi di commutazione ingombranti, inaffidabili e delicati come tubi a vuoto e relè. Questa innovazione ha facilitato la costruzione di CPU più complesse e robuste, spesso integrate su uno o più circuiti stampati utilizzando componenti discreti (singoli).

Nel 1964, IBM ha presentato la sua architettura di computer System/360, che ha sostenuto una famiglia di computer in grado di eseguire programmi identici a velocità e livelli di prestazioni variabili. Ciò rappresentò una svolta significativa, dato che la maggior parte dei computer elettronici dell'epoca, anche quelli dello stesso produttore, erano in gran parte incompatibili. Per ottenere questa interoperabilità, IBM ha implementato il concetto di microprogramma, spesso definito "microcodice", una tecnica che rimane ampiamente utilizzata nelle CPU contemporanee. L'architettura System/360 raggiunse un'enorme popolarità, dominando per decenni il mercato dei computer mainframe e stabilendo un'eredità duratura perpetuata da sistemi moderni come IBM zSeries. Successivamente, nel 1965, la Digital Equipment Corporation (DEC) introdusse un altro computer di grande impatto, il PDP-8, destinato specificamente alle applicazioni scientifiche e di ricerca.

I computer basati su transistor offrivano numerosi notevoli vantaggi rispetto ai loro predecessori. Oltre a migliorare l'affidabilità e ridurre il consumo energetico, i transistor hanno consentito alle CPU di raggiungere velocità operative significativamente più elevate grazie ai loro tempi di commutazione intrinsecamente più brevi rispetto ai tubi a vuoto o ai relè. I miglioramenti combinati nell'affidabilità e la velocità notevolmente aumentata di questi elementi di commutazione, che in questo periodo erano quasi esclusivamente transistor, facilitarono le velocità di clock della CPU nell'ordine delle decine di megahertz. Contemporaneamente, insieme all'adozione diffusa di CPU a transistor discreti e circuiti integrati (IC), hanno cominciato ad emergere nuove architetture ad alte prestazioni, come i processori vettoriali SIMD (single instructions, multiple data). Questi progetti sperimentali iniziali hanno successivamente aperto la strada allo sviluppo di supercomputer specializzati, esemplificati da quelli prodotti da Cray Inc e Fujitsu Ltd.

Unità di elaborazione centrale di integrazione su piccola scala

Quest'epoca ha visto lo sviluppo di un metodo per produrre numerosi transistor interconnessi con un ingombro compatto. Il circuito integrato (IC) ha facilitato la fabbricazione di una notevole quantità di transistor su un unico dischetto semiconduttore, comunemente noto come "chip". Inizialmente, solo i circuiti digitali fondamentali e non specializzati, come le porte NOR, venivano miniaturizzati nei circuiti integrati. Le unità di elaborazione centrale (CPU) costruite a partire da questi circuiti integrati "building block" fondamentali sono generalmente classificate come dispositivi di "integrazione su piccola scala" (SSI). I circuiti integrati SSI, esemplificati da quelli utilizzati nell'Apollo Guidance Computer, in genere incorporavano fino a diverse dozzine di transistor. La costruzione di una CPU completa da circuiti integrati SSI richiedeva migliaia di chip singoli, ma questo approccio ha ridotto significativamente lo spazio e il consumo energetico rispetto alle precedenti architetture a transistor discreti.

Il System/370 di IBM, succedendo al System/360, ha adottato i circuiti integrati SSI invece dei moduli transistor discreti della Solid Logic Technology. Allo stesso modo, i PDP-8/I e KI10 PDP-10 di DEC sono passati dai singoli transistor utilizzati nei PDP-8 e KA PDP-10 ai circuiti integrati SSI. Inoltre, la loro serie PDP-11 di grande successo utilizzava inizialmente circuiti integrati SSI, ma in seguito è passata a componenti LSI (Large-Scale Integration) non appena questi sono diventati utilizzabili.

Integrazione su larga scala nelle CPU

Lee Boysel è autore di pubblicazioni influenti, in particolare di un "manifesto" del 1967, che descrive in dettaglio la costruzione di un computer mainframe a 32 bit equivalente utilizzando un numero relativamente piccolo di circuiti di integrazione su larga scala (LSI). Il metodo esclusivo per fabbricare chip LSI, definiti come quelli contenenti cento o più porte, prevedeva l'impiego di un processo di produzione di semiconduttori metallo-ossido-semiconduttore (MOS), che comprendeva la logica PMOS, NMOS o CMOS. Tuttavia, alcuni produttori persistettero nello sviluppo di processori che utilizzavano chip TTL (transistor-transistor bipolar), poiché i transistor a giunzione bipolare offrivano velocità superiori rispetto ai chip MOS fino agli anni '70; alcune entità, come Datapoint, continuarono questa pratica fino all'inizio degli anni '80. Durante gli anni '60, i circuiti integrati MOS mostrarono prestazioni più lente e inizialmente furono ritenuti adatti principalmente per applicazioni a bassa potenza. In seguito allo sviluppo della tecnologia MOS con gate in silicio da parte di Federico Faggin presso Fairchild Semiconductor nel 1968, i circuiti integrati MOS hanno sostituito prevalentemente il TTL bipolare come tecnologia di chip prevalente alla fine degli anni '70.

Con il progresso della tecnologia microelettronica, un numero crescente di transistor è stato integrato nei circuiti integrati, riducendo così la quantità di circuiti integrati discreti necessari per una CPU completa. L'integrazione su scala media (MSI) e i circuiti integrati LSI hanno aumentato il numero di transistor, inizialmente a centinaia e successivamente a migliaia. Nel 1968, il numero richiesto di circuiti integrati per costruire una CPU completa era sceso a 24, comprendendo otto tipi distinti, con ciascun circuito integrato che incorporava circa 1000 MOSFET. In netto contrasto con i suoi antecedenti SSI e MSI, l'iterazione inaugurale LSI del PDP-11 prevedeva una CPU costruita con soli quattro circuiti integrati LSI.

Microprocessori

Fin dalla loro introduzione iniziale, i microprocessori hanno ampiamente soppiantato tutte le altre metodologie per l'implementazione delle unità di elaborazione centrale. Il primo microprocessore disponibile in commercio, introdotto nel 1971, fu l'Intel 4004. L'Intel 4004 rappresentò una delle prime CPU orientate al consumatore a integrare l'unità logica aritmetica, l'unità di controllo e l'unità di registro su un singolo chip. Il primo microprocessore ampiamente adottato, rilasciato nel 1974, fu l'Intel 8080. Contemporaneamente, i produttori di mainframe e minicomputer avviarono programmi proprietari di sviluppo di circuiti integrati per modernizzare le loro architetture di computer esistenti, producendo infine microprocessori compatibili con set di istruzioni che mantenevano la compatibilità con i loro hardware e software legacy. In concomitanza con l'emergere e la successiva adozione diffusa del personal computer, la designazione CPU è ora prevalentemente riservata ai microprocessori. Più CPU, denominate core, possono essere integrate all'interno di un singolo chip di elaborazione.

Le precedenti unità di elaborazione centrale (CPU) erano costruite con componenti discreti e più piccoli circuiti integrati (IC) distribuiti su uno o più circuiti stampati. Al contrario, i microprocessori rappresentano CPU fabbricate su un numero minimo di circuiti integrati, tipicamente uno solo. Questa riduzione dell'ingombro della CPU, ottenuta attraverso l'implementazione di un singolo die, facilita tempi di commutazione accelerati grazie ad attributi fisici come la ridotta capacità parassita del gate. Di conseguenza, i microprocessori sincroni hanno raggiunto frequenze di clock che vanno da decine di megahertz a diversi gigahertz. Inoltre, la capacità di fabbricare transistor eccezionalmente piccoli su un circuito integrato ha aumentato in modo esponenziale la complessità e il numero di transistor all'interno di una singola CPU. Questa tendenza pervasiva è ben sintetizzata dalla Legge di Moore, che ha previsto accuratamente la crescente complessità delle CPU e di altri circuiti integrati fino al 2016 circa.

Nonostante le significative trasformazioni nella complessità, nelle dimensioni fisiche, nelle metodologie di costruzione e nell'architettura complessiva delle CPU a partire dal 1950, la loro progettazione fondamentale e i principi operativi sono rimasti in gran parte coerenti. La stragrande maggioranza delle CPU contemporanee sono caratterizzate precisamente come architetture di programmi memorizzati di von Neumann. Con la cessazione dell'accuratezza predittiva della Legge di Moore, sono emerse preoccupazioni riguardo ai limiti intrinseci della tecnologia dei transistor a circuito integrato. La profonda miniaturizzazione dei varchi elettronici aggrava l’impatto di fenomeni come l’elettromigrazione e la perdita sottosoglia. Queste sfide emergenti sono solo uno dei numerosi fattori che spingono i ricercatori a esplorare nuovi paradigmi computazionali, incluso l'informatica quantistica, e ad ampliare l'applicazione del parallelismo e di altre strategie che migliorano l'utilità del modello classico di von Neumann.

Principi operativi

Indipendentemente dalla loro manifestazione fisica, la funzione principale della maggior parte delle unità di elaborazione centrale (CPU) prevede l'esecuzione di una sequenza predeterminata di istruzioni memorizzate, collettivamente definite programma. Queste istruzioni risiedono all'interno di una forma di memoria del computer. Praticamente tutte le CPU aderiscono a una sequenza operativa in tre fasi (recupero, decodifica ed esecuzione) che insieme costituiscono il ciclo di istruzioni.

Dopo l'esecuzione delle istruzioni, il processo si ripete, con il ciclo di istruzioni successivo che in genere recupera l'istruzione sequenziale successiva a causa del valore incrementato all'interno del contatore del programma. Se viene eseguita un'istruzione di salto, il contatore del programma viene riconfigurato per mantenere l'indirizzo dell'istruzione di destinazione, consentendo all'esecuzione del programma di procedere normalmente. Le CPU avanzate sono in grado di recuperare, decodificare ed eseguire più istruzioni contemporaneamente. Questa discussione delinea la "conduttura RISC classica", un'architettura prevalente nelle CPU più semplici spesso impiegate in numerosi dispositivi elettronici, spesso designati come microcontrollori. Omette deliberatamente la funzione critica della cache della CPU e, di conseguenza, la fase di accesso della pipeline.

Alcune istruzioni modificano direttamente il contatore del programma invece di generare dati di output; questi sono comunemente chiamati "salti" e abilitano costrutti di programmazione come loop, esecuzione condizionale (tramite salti condizionali) e chiamate di funzioni. All'interno di specifici processori, altre istruzioni alterano gli stati dei bit all'interno di un registro "flag". Questi flag servono a modulare il comportamento del programma segnalando i risultati di diverse operazioni. Ad esempio, in questi processori, un'istruzione di "confronto" valuta due valori e successivamente imposta o cancella i bit nel registro dei flag per denotare la loro grandezza relativa o uguaglianza; uno di questi flag può quindi essere utilizzato da una successiva istruzione di salto per dettare il flusso del programma.

Recupero istruzioni

La fase di recupero comporta il recupero di un'istruzione, tipicamente rappresentata come un valore numerico o una sequenza, dalla memoria del programma. L'indirizzo di memoria dell'istruzione è specificato dal contatore del programma (PC), noto come "puntatore dell'istruzione" nei microprocessori Intel x86, che mantiene l'indirizzo dell'istruzione successiva in attesa di recupero. Dopo il recupero dell'istruzione, il PC viene incrementato della lunghezza dell'istruzione per puntare all'indirizzo dell'istruzione successiva nella sequenza di esecuzione. Spesso, il recupero di istruzioni da una memoria relativamente lenta può provocare stalli della CPU in attesa del recupero dei dati. Questa sfida viene mitigata principalmente nei processori contemporanei attraverso l'implementazione di cache e architetture di pipeline.

Decodifica istruzione

Le azioni della CPU sono dettate dalle istruzioni recuperate dalla memoria. Durante la fase di decodifica, il circuito specializzato del decodificatore binario, denominato decodificatore di istruzioni, traduce questa istruzione in segnali di controllo che governano le operazioni di altri componenti della CPU.

L'interpretazione di un'istruzione è governata dall'architettura del set di istruzioni (ISA) della CPU. In genere, uno specifico gruppo di bit, o "campo", all'interno dell'istruzione, noto come codice operativo, designa l'operazione da eseguire. Contemporaneamente altri campi forniscono generalmente dati aggiuntivi necessari per l'operazione, come gli operandi. Questi operandi possono essere definiti come costante (un valore immediato) o come posizione, che potrebbe essere un registro del processore o un indirizzo di memoria, a seconda della modalità di indirizzamento specificata.

Alcune architetture CPU incorporano un circuito decodificatore binario cablato e immutabile per la decodifica delle istruzioni. Al contrario, altri progetti utilizzano un microprogramma per tradurre le istruzioni in sequenze di segnali di configurazione della CPU, che vengono applicati su successivi impulsi di clock. In casi specifici, la memoria che ospita il microprogramma è riscrivibile, consentendo così modifiche alla metodologia di decodifica delle istruzioni della CPU.

Fase di esecuzione

Dopo le fasi di recupero e decodifica, inizia la fase di esecuzione. Questa fase può comprendere un'azione singola o una serie di azioni, a seconda della progettazione dell'architettura della CPU. Per ogni azione, i segnali di controllo attivano o disattivano elettronicamente specifici componenti della CPU, consentendo loro di eseguire l'intera o una parte dell'operazione prevista. L'azione si conclude tipicamente con la ricezione di un impulso di clock. Spesso i risultati vengono memorizzati in un registro interno della CPU per facilitarne il rapido recupero da parte delle istruzioni successive. In alternativa, i risultati possono essere affidati alla memoria principale, che offre un accesso più lento ma è più economica e possiede una maggiore capacità.

Ad esempio, quando viene eseguita un'istruzione di addizione, vengono attivati ​​i registri che contengono gli operandi (i numeri da sommare), insieme alle sezioni pertinenti dell'unità logica aritmetica (ALU) responsabile dell'addizione. Al verificarsi di un impulso di clock, gli operandi vengono trasferiti dai rispettivi registri sorgente all'ALU e la somma risultante viene generata alla sua uscita. I successivi impulsi di clock facilitano l'attivazione e la disattivazione di altri componenti per trasferire l'output (la somma dell'operazione) in una posizione di archiviazione designata, come un registro o una memoria. Se la somma calcolata supera la dimensione della parola di output dell'ALU, viene impostato un flag di overflow aritmetico, che successivamente influisce sull'operazione successiva.

Progettazione architettonica e implementazione

Le operazioni fondamentali che una CPU può eseguire sono intrinsecamente integrate nei suoi circuiti, formando collettivamente un set di istruzioni. Queste operazioni comprendono compiti come addizioni o sottrazioni aritmetiche, confronti numerici o controllo del flusso del programma (ad esempio, passaggio a un segmento di codice diverso). Ogni istruzione è codificata in modo univoco da uno specifico pattern di bit, denominato codice operativo del linguaggio macchina. Durante l'elaborazione delle istruzioni, la CPU utilizza un decodificatore binario per tradurre il codice operativo in segnali di controllo, che successivamente coordinano le funzioni interne della CPU. Un'istruzione completa in linguaggio macchina comprende tipicamente un codice operativo insieme a bit supplementari che definiscono gli argomenti dell'operazione (ad esempio, i valori da aggiungere in un'istruzione di addizione). A un livello di astrazione più elevato, un programma in linguaggio macchina costituisce una sequenza ordinata di istruzioni in linguaggio macchina eseguite dalla CPU.

Le operazioni matematiche fondamentali per ciascuna istruzione vengono eseguite da un circuito logico combinatorio situato all'interno del processore della CPU, noto come unità aritmetico-logica (ALU). In genere, una CPU elabora un'istruzione recuperandola dalla memoria, utilizzando la sua ALU per eseguire l'operazione specificata e successivamente reimpostando il risultato in memoria. Oltre alle istruzioni per l'aritmetica degli interi e le operazioni logiche, esiste una vasta gamma di altre istruzioni macchina, comprese quelle per il trasferimento dei dati (caricamento da e archiviazione nella memoria), ramificazioni condizionali e aritmetica in virgola mobile, che sono gestite dall'unità a virgola mobile (FPU) della CPU.

L'unità di controllo

L'unità di controllo (CU) è un componente integrale della CPU responsabile dell'orchestrazione delle operazioni del processore. Emette direttive alla memoria del computer, all'unità aritmetica e logica e ai dispositivi di input/output, istruendoli su come rispondere ai comandi trasmessi al processore.

L'unità di controllo (CU) orchestra le operazioni di altri componenti generando segnali di temporizzazione e controllo. Gestisce la maggior parte delle risorse del computer e dirige il flusso di dati tra l'unità di elaborazione centrale (CPU) e i dispositivi periferici. John von Neumann incorporò l'unità di controllo come elemento fondamentale dell'architettura von Neumann. Nei progetti di computer contemporanei, l'unità di controllo è generalmente integrata nella CPU, mantenendo la sua funzione essenziale e i suoi principi operativi sin dal suo inizio.

Unità logico-aritmetica

L'unità logica aritmetica (ALU) costituisce un circuito digitale incorporato nel processore, responsabile dell'esecuzione di operazioni aritmetiche di numeri interi e logiche bit a bit. Gli ingressi all'ALU comprendono le parole di dati designate per l'elaborazione (denominate operandi), i dati di stato delle operazioni precedenti e un codice operativo fornito dall'unità di controllo. L'origine di questi operandi varia in base all'istruzione eseguita, potenzialmente proveniente da registri interni della CPU, memoria esterna o costanti generate internamente dall'ALU.

Dopo la stabilizzazione e la propagazione di tutti i segnali di ingresso attraverso i circuiti dell'ALU, il risultato dell'operazione eseguita diventa disponibile alle uscite dell'ALU. Questo risultato comprende sia una parola di dati, che può essere successivamente archiviata in un registro o memoria, sia informazioni sullo stato, generalmente conservate in un registro interno dedicato della CPU.

Le unità di elaborazione centrale (CPU) contemporanee spesso incorporano più unità logiche aritmetiche (ALU) per migliorare le prestazioni computazionali.

Unità di generazione indirizzo

L'unità di generazione degli indirizzi (AGU), nota anche come unità di calcolo degli indirizzi (ACU), è un componente di esecuzione all'interno dell'unità di elaborazione centrale (CPU) responsabile del calcolo degli indirizzi di memoria richiesti per l'accesso alla memoria principale. Delegare i calcoli degli indirizzi a circuiti dedicati che operano contemporaneamente ad altre funzioni della CPU riduce il numero di cicli della CPU necessari per eseguire le istruzioni della macchina, ottenendo così miglioramenti delle prestazioni.

Durante vari processi operativi, le CPU devono calcolare gli indirizzi di memoria per recuperare i dati dalla memoria; ad esempio, le posizioni in memoria degli elementi dell'array richiedono un calcolo prima del recupero dei dati dai loro indirizzi di memoria fisica. Questi calcoli di generazione degli indirizzi coinvolgono diverse operazioni aritmetiche su numeri interi, tra cui addizione, sottrazione, operazioni modulo e spostamenti di bit. Spesso, la determinazione di un indirizzo di memoria richiede più istruzioni macchina generiche, che potrebbero non essere decodificate ed eseguite in modo efficiente. L'integrazione di un'AGU in un'architettura della CPU, insieme a istruzioni specializzate che sfruttano l'AGU, consente di scaricare numerosi calcoli di generazione degli indirizzi dalla CPU principale, spesso facilitandone la rapida esecuzione all'interno di un singolo ciclo della CPU.

Le funzionalità di un'AGU dipendono dalla specifica CPU e dal suo design architettonico. Di conseguenza, alcune AGU implementano ed espongono una gamma più ampia di operazioni di calcolo degli indirizzi, mentre altre incorporano istruzioni specializzate più sofisticate in grado di elaborare più operandi contemporaneamente. Alcune architetture di CPU presentano più AGU, consentendo l'esecuzione simultanea di diverse operazioni di calcolo degli indirizzi, ottenendo così ulteriori miglioramenti prestazionali attribuiti alle caratteristiche superscalari dei progetti di CPU avanzati. Ad esempio, Intel integra più AGU nelle sue microarchitetture Sandy Bridge e Haswell, migliorando la larghezza di banda del sottosistema di memoria della CPU facilitando l'esecuzione parallela di più istruzioni di accesso alla memoria.

Unità di gestione della memoria (MMU)

Numerosi microprocessori, presenti in dispositivi come smartphone, computer desktop, laptop e server, incorporano un'unità di gestione della memoria (MMU). Questa unità traduce gli indirizzi logici in indirizzi RAM fisici, offrendo contemporaneamente protezione della memoria e funzionalità di paging essenziali per l'implementazione della memoria virtuale. Sebbene tipicamente integrata all'interno del processore, la MMU può occasionalmente risiedere in un circuito integrato (IC) separato. I processori più semplici, in particolare i microcontrollori, generalmente non includono una MMU.

Cache

Una cache della CPU è una memoria utilizzata dall'unità di elaborazione centrale (CPU) di un computer per ridurre al minimo la latenza media e il consumo energetico associati all'accesso ai dati dalla memoria principale. Una cache è una memoria compatta e ad alta velocità situata prossimalmente al core del processore, che conserva i duplicati dei dati a cui si accede frequentemente che risiedono nella memoria principale. La maggior parte delle CPU incorpora più cache distinte, tipicamente strutturate gerarchicamente su più livelli (L1, L2, L3, L4, ecc.). I livelli successivi di cache in questa gerarchia sono generalmente caratterizzati da una maggiore capacità ma da una velocità ridotta rispetto ai loro predecessori, con L1 che rappresenta il livello più veloce e più vicino alla CPU. Il livello L1 incorpora comunemente cache separate per istruzioni e dati.

Le unità di elaborazione centrale (CPU) contemporanee ad alte prestazioni, con rare eccezioni specializzate, incorporano più livelli gerarchici di memoria cache. Le implementazioni iniziali della CPU con memoria cache utilizzavano un singolo livello di cache che, a differenza delle successive cache L1, non era biforcato in componenti distinti L1d (dati) e L1i (istruzioni). Praticamente tutte le attuali CPU dotate di cache utilizzano un'architettura di cache L1 divisa. Questi processori in genere includono anche cache L2, mentre i processori più grandi incorporano anche cache L3. La cache L2 è generalmente unificata (non divisa) e funziona come un repository condiviso per i dati della cache L1 divisa. All'interno di un processore multi-core, ciascun core possiede una cache L2 dedicata, che in genere non è condivisa tra gli altri core. Al contrario, le cache L3 e tutte le successive cache di livello superiore sono condivise su più core e rimangono non suddivise. La cache L4 è attualmente rara ed è tipicamente implementata utilizzando la memoria dinamica ad accesso casuale (DRAM) anziché la memoria statica ad accesso casuale (SRAM), spesso residente su un die o chip distinto. Storicamente, un posizionamento esterno simile si applicava alle cache L1; tuttavia, i progressi nella fabbricazione dei chip hanno consentito l'integrazione di L1 e della maggior parte degli altri livelli di cache sul die del processore principale, con la potenziale eccezione della cache di livello più alto. Ogni livello di cache aggiuntivo è generalmente caratterizzato da una maggiore capacità e da strategie di ottimizzazione distinte.

Oltre la gerarchia della cache primaria, esistono altri tipi di cache specializzati, che in genere non sono inclusi nella metrica aggregata della "dimensione della cache" delle suddette cache principali. Un esempio è il translation lookaside buffer (TLB), un componente integrale dell'unità di gestione della memoria (MMU) presente nella maggior parte delle CPU.

Le capacità della cache sono generalmente dimensionate in potenze di due, ad esempio 2, 8 o 16 KiB o MiB per cache non L1 più grandi. Tuttavia, esistono delle eccezioni, esemplificate da IBM z13, che dispone di una cache di istruzioni L1 da 96 KiB.

Frequenza orologio

La maggior parte delle unità di elaborazione centrale funziona come circuiti sincroni, utilizzando un segnale di clock per regolare le operazioni sequenziali. Questo segnale di clock ha origine da un circuito oscillatore esterno, che produce un numero consistente di impulsi al secondo, manifestandosi come un'onda quadra periodica. La frequenza di questi impulsi di clock determina la velocità di esecuzione delle istruzioni della CPU; di conseguenza, una frequenza di clock più elevata consente alla CPU di elaborare un numero maggiore di istruzioni al secondo.

Affinché la CPU funzioni correttamente, il periodo di clock deve superare la durata massima richiesta affinché tutti i segnali interni si propaghino in tutta l'unità. Stabilendo un periodo di clock significativamente maggiore del ritardo di propagazione nel caso peggiore, i progettisti possono sincronizzare il funzionamento dell'intera CPU e il movimento dei dati con i fronti di salita e di discesa del segnale di clock. Questo approccio offre il vantaggio sostanziale di semplificare la progettazione della CPU e ridurre la complessità dei componenti. Tuttavia, uno svantaggio è che l'intera CPU è vincolata dai suoi componenti più lenti, anche quando le altre sezioni funzionano a velocità considerevolmente più elevate. Questa limitazione intrinseca è stata ampiamente mitigata attraverso l'implementazione di varie tecniche volte a migliorare il parallelismo della CPU.

Tuttavia, i progressi dell'architettura da soli non risolvono completamente tutti gli svantaggi intrinseci delle CPU sincrone a livello globale. Ad esempio, un segnale di clock, come qualsiasi altro segnale elettrico, è suscettibile a ritardi di propagazione. Le frequenze di clock elevate nelle CPU progressivamente complesse aggravano la sfida di mantenere la sincronizzazione di fase del segnale di clock nell'intera unità di elaborazione. Di conseguenza, numerose CPU contemporanee richiedono la fornitura di più segnali di clock identici per evitare ritardi sostanziali in un singolo segnale che potrebbero portare al malfunzionamento della CPU. Un'ulteriore preoccupazione significativa, in particolare con aumenti sostanziali delle frequenze di clock, è la crescente dissipazione termica generata dalla CPU. La continua commutazione del segnale di clock costringe numerosi componenti a cambiare stato indipendentemente dal loro utilizzo attivo. In genere, un componente di commutazione consuma più energia di uno in stato statico. Pertanto, un aumento della frequenza di clock è direttamente correlato a un consumo energetico più elevato, rendendo quindi necessari meccanismi di dissipazione del calore più robusti, spesso sotto forma di soluzioni specializzate di raffreddamento della CPU.

Una tecnica per gestire l'attivazione dei componenti superflui è il clock gating, che prevede la disattivazione del segnale di clock fornito a questi componenti, rendendoli così inoperativi. Tuttavia, la sua implementazione è spesso considerata impegnativa, limitandone l’adozione diffusa a progetti specializzati a basso consumo. Un esempio importante di ampia applicazione di clock gating è la CPU Xenon basata su IBM PowerPC all'interno della Xbox 360, che contribuisce in modo significativo a ridurre il consumo energetico della console.

CPU senza clock

Un approccio alternativo per mitigare i problemi associati a un segnale di clock globale prevede la sua completa eliminazione. Sebbene l'assenza di un segnale di clock globale aumenti sostanzialmente la complessità della progettazione, le architetture asincrone (o senza clock) offrono vantaggi distinti in termini di consumo energetico e gestione termica rispetto alle loro controparti sincrone. Nonostante la loro relativa rarità, sono state sviluppate unità di elaborazione centrale asincrone complete senza fare affidamento su un segnale di clock globale. Esempi illustrativi includono AMULET compatibile con ARM e MiniMIPS compatibile con MIPS R3000.

Invece di eliminare completamente il segnale di clock, alcune architetture CPU incorporano elementi asincroni all'interno di sezioni specifiche del dispositivo. Ad esempio, l'integrazione di unità logiche aritmetiche (ALU) asincrone con pipeline superscalare può produrre miglioramenti nelle prestazioni aritmetiche. Sebbene la parità o la superiorità prestazionale complessiva dei progetti completamente asincroni rispetto a quelli sincroni rimanga un'area di indagine in corso, essi mostrano in modo dimostrabile competenza nei calcoli matematici meno complessi. Questa caratteristica, unita all'efficienza energetica e alla dissipazione termica superiori, li rende altamente appropriati per le applicazioni informatiche embedded.

Modulo regolatore di tensione

Le unità di elaborazione centrale contemporanee spesso incorporano un modulo di gestione dell'alimentazione integrato nel die. Questo modulo regola dinamicamente la tensione di alimentazione ai circuiti della CPU, ottimizzando così l'equilibrio tra prestazioni operative e consumo energetico.

Intervallo di numeri interi

Ogni unità di elaborazione centrale utilizza una metodologia distinta per rappresentare i valori numerici. Storicamente, alcuni dei primi sistemi di elaborazione digitale utilizzavano valori di sistema numerici decimali familiari (base 10), mentre altri adottavano rappresentazioni meno convenzionali, incluso il decimale codificato bi-quinario (base 2-5) o il ternario (base 3). Attualmente, la stragrande maggioranza delle moderne CPU rappresenta i numeri in formato binario, dove ogni cifra corrisponde a uno stato fisico a due valori, come una tensione "alta" o "bassa".

La dimensione e la precisione dei numeri interi rappresentabili da una CPU sono intrinsecamente legate al suo schema di rappresentazione numerica. Per una CPU binaria, questa caratteristica è quantificata dal numero di bit (che sono le cifre significative di un numero intero con codifica binaria) che la CPU può elaborare in una singola operazione. Questa metrica viene spesso definita dimensione della parola, larghezza in bit, larghezza del percorso dati, precisione intera o dimensione intera. La dimensione intera di una CPU determina lo spettro di valori interi su cui può eseguire direttamente operazioni. Ad esempio, una CPU a 8 bit è in grado di manipolare direttamente numeri interi rappresentati da otto bit, che comprendono un intervallo di 256 (2§1011§) valori interi distinti.

L'intervallo intero influenza anche la quantità di posizioni di memoria che una CPU può indirizzare direttamente, dove un indirizzo costituisce un valore intero che designa una particolare posizione di memoria. Ad esempio, se una CPU binaria utilizza 32 bit per rappresentare un indirizzo di memoria, può accedere direttamente a 232 posizioni di memoria distinte. Per superare questa limitazione intrinseca, tra le altre considerazioni, alcune CPU implementano meccanismi come la gestione della memoria o il cambio di banco, che facilitano l'indirizzamento di capacità di memoria espanse.

Le CPU con parole di dimensioni maggiori necessitano di circuiti più grandi, con conseguenti dimensioni fisiche maggiori, costi di produzione più elevati e un consumo energetico elevato, che a sua volta genera più calore. Di conseguenza, nonostante la disponibilità di CPU con dimensioni di parola significativamente più grandi (ad esempio, 16, 32, 64 o anche 128 bit), i microcontrollori compatti a 4 o 8 bit vengono spesso utilizzati nelle applicazioni contemporanee. Tuttavia, negli scenari che richiedono prestazioni superiori, i vantaggi di una dimensione di parola estesa, come intervalli di dati più ampi e spazi di indirizzi più ampi, possono superare questi inconvenienti. Per mitigare dimensioni e costi, una CPU può incorporare percorsi dati interni più stretti della dimensione nominale delle parole. Ad esempio, sebbene l'architettura del set di istruzioni IBM System/360 fosse a 32 bit, il System/360 Modello 30 e Modello 40 presentava percorsi dati a 8 bit all'interno delle loro unità logiche aritmetiche, richiedendo quattro cicli per un'addizione a 32 bit, con ciascun ciclo che elaborava 8 bit degli operandi. Allo stesso modo, nonostante il set di istruzioni della serie Motorola 68000 fosse a 32 bit, il Motorola 68000 e il Motorola 68010 utilizzavano percorsi dati a 16 bit nelle loro unità logiche aritmetiche, richiedendo quindi due cicli per un'addizione a 32 bit.

Per sfruttare i vantaggi associati sia alle lunghezze di bit più corte che a quelle più lunghe, numerosi set di istruzioni utilizzano larghezze di bit distinte per i dati interi e a virgola mobile. Questo approccio progettuale consente alle CPU che implementano tali set di istruzioni di presentare larghezze di bit variabili tra diversi componenti interni. Ad esempio, il set di istruzioni IBM System/360, sebbene prevalentemente a 32 bit, incorporava il supporto per valori a virgola mobile a 64 bit per migliorare la precisione e la gamma nei calcoli numerici. Nello specifico, il System/360 Modello 65 includeva un sommatore a 8 bit per operazioni decimali e binarie in virgola fissa, insieme a un sommatore a 60 bit dedicato all'aritmetica in virgola mobile. Le architetture successive della CPU adottano spesso strategie simili con larghezza di bit mista, in particolare nei processori per uso generico in cui è essenziale un equilibrio ottimale tra capacità di elaborazione di numeri interi e a virgola mobile.

Parallelismo

La sezione precedente descriveva in dettaglio i principi operativi fondamentali di una CPU, illustrandone la configurazione più rudimentale. Questa architettura della CPU, comunemente definita subscalare, elabora ed esegue una singola istruzione su uno o due elementi di dati contemporaneamente, risultando in una metrica delle prestazioni inferiore a un'istruzione per ciclo di clock (IPC < 1).

Questo paradigma operativo introduce intrinsecamente inefficienze all'interno delle CPU subscalari. Dato che viene eseguita una sola istruzione alla volta, l'intera CPU deve fermarsi fino al completamento dell'istruzione corrente prima di avviare quella successiva. Di conseguenza, le CPU subscalari subiscono ritardi quando incontrano istruzioni che richiedono più cicli di clock per l'esecuzione. Anche l'integrazione di un'unità di esecuzione aggiuntiva non migliora sostanzialmente le prestazioni; invece di un singolo percorso in stallo, due percorsi vengono in stallo, portando ad un aumento dei transistor non utilizzati. Questo progetto architettonico, in cui le risorse di esecuzione della CPU sono limitate all'elaborazione di un'istruzione alla volta, può teoricamente raggiungere un massimo di prestazioni scalari, definite come un'istruzione per ciclo di clock (IPC = 1). Tuttavia, le prestazioni effettive rimangono in genere subscalari, indicando meno di un'istruzione per ciclo di clock (IPC < 1).

Gli sforzi per ottenere prestazioni scalari o superiori hanno portato allo sviluppo di diverse metodologie di progettazione che promuovono un funzionamento della CPU meno lineare e più parallelo. Nel contesto del parallelismo della CPU, due termini principali vengono comunemente utilizzati per classificare queste tecniche di progettazione:

Il

Ogni metodologia presenta approcci di implementazione distinti e offre diversi gradi di efficacia nel migliorare le prestazioni della CPU per applicazioni specifiche.

Parallelismo a livello di istruzione

Un approccio fondamentale per migliorare il parallelismo computazionale prevede l'avvio delle fasi iniziali di recupero e decodifica delle istruzioni prima del completamento dell'esecuzione dell'istruzione precedente. Questa metodologia, denominata pipeline di istruzioni, è utilizzata ovunque in quasi tutte le unità di elaborazione centrale (CPU) contemporanee per uso generale. Il pipeline facilita l'esecuzione simultanea di più istruzioni segmentando il percorso di esecuzione in fasi distinte e sequenziali. Questa scomposizione dell'architettura è analoga a una catena di montaggio, in cui ogni istruzione avanza attraverso fasi successive, diventando progressivamente più completa finché non esce dalla pipeline di esecuzione e viene ritirata.

Tuttavia, la pipeline introduce intrinsecamente il potenziale di conflitti di dipendenza dei dati, uno scenario in cui il risultato di un'operazione precedente è necessario per il completamento di un'operazione successiva. Di conseguenza, i processori in pipeline sono progettati per rilevare tali condizioni e, quando necessario, introdurre ritardi all'interno di segmenti specifici della pipeline. Un processore in pipeline può raggiungere livelli di prestazioni che si avvicinano a quelli di un processore scalare, con la sua efficienza limitata principalmente dagli stalli della pipeline, che si verificano quando un'istruzione occupa una fase per più di un singolo ciclo di clock.

I progressi nel pipeline delle istruzioni hanno progressivamente ridotto i periodi di inattività dei componenti della CPU. Le architetture superscalari sono caratterizzate da pipeline di istruzioni estese e dall'integrazione di più unità di esecuzione identiche, che comprendono componenti come unità di memorizzazione del carico, unità aritmetico-logiche, unità a virgola mobile e unità di generazione di indirizzi. All'interno di una pipeline superscalare, le istruzioni vengono recuperate e inoltrate a un dispatcher, che ne determina il potenziale per l'esecuzione parallela (simultanea). Se l'esecuzione parallela è fattibile, le istruzioni vengono quindi inviate alle unità di esecuzione appropriate, portando alla loro elaborazione simultanea. Fondamentalmente, il rendimento di una CPU superscalare, misurato dal numero di istruzioni completate per ciclo, è direttamente correlato alla sua capacità di inviare simultaneamente istruzioni a queste unità di esecuzione.

Una sfida significativa nella progettazione di architetture CPU superscalari risiede nello sviluppo di un dispatcher efficiente. Questo componente deve accertare rapidamente l'eseguibilità parallela delle istruzioni e successivamente inviarle per massimizzare l'utilizzo delle unità di esecuzione disponibili. Per raggiungere questo obiettivo è necessario un frequente rifornimento della pipeline di istruzioni e notevoli risorse di cache della CPU. Inoltre, le strategie di prevenzione dei rischi, tra cui la previsione delle diramazioni, l’esecuzione speculativa, la ridenominazione dei registri, l’esecuzione fuori ordine e la memoria transazionale, diventano indispensabili per sostenere livelli di prestazione elevati. Attraverso la previsione del probabile percorso della diramazione per le istruzioni condizionali, la CPU può ridurre sostanzialmente i casi in cui l'intera pipeline deve entrare in stallo in attesa del completamento di un'operazione condizionale. L'esecuzione speculativa in genere produce miglioramenti moderati delle prestazioni eseguendo segmenti di codice che alla fine potrebbero non essere necessari a seguito di un'operazione condizionale. L'esecuzione fuori ordine riordina dinamicamente l'esecuzione delle istruzioni per mitigare i ritardi derivanti dalle dipendenze dei dati. Inoltre, negli scenari che coinvolgono un singolo flusso di istruzioni che opera su più flussi di dati, in particolare quando si elaborano grandi volumi di dati omogenei, i processori moderni possono disabilitare selettivamente i segmenti della pipeline. Ciò consente alla CPU di bypassare le fasi di recupero e decodifica quando una singola istruzione viene eseguita ripetutamente, migliorando così in modo significativo le prestazioni in contesti specifici, in particolare all'interno di motori computazionali altamente ripetitivi come software di creazione di video e di elaborazione di foto.

Quando solo un sottoinsieme di componenti di una CPU mostra capacità superscalari, le porzioni non superscalari incorrono in un sovraccarico di prestazioni attribuito agli stalli di pianificazione. Ad esempio, l'Intel P5 Pentium presentava due unità logiche aritmetiche (ALU) superscalari, ciascuna in grado di accettare un'istruzione per ciclo di clock, ma la sua unità a virgola mobile (FPU) non aveva questa capacità. Di conseguenza, P5 è stato caratterizzato come superscalare intero ma non superscalare in virgola mobile. La successiva architettura P6 di Intel ha esteso la funzionalità superscalare alle sue operazioni in virgola mobile.

Le architetture pipelining e superscalari migliorano il parallelismo a livello di istruzione (ILP) della CPU consentendo l'esecuzione di più istruzioni per ciclo di clock. I progetti di CPU contemporanei spesso incorporano funzionalità superscalari, con praticamente tutti i processori generici sviluppati negli ultimi dieci anni che presentano questa caratteristica architetturale. Successivamente, l'attenzione nello sviluppo di sistemi informatici ad alto ILP si è spostata dalle implementazioni hardware della CPU all'interfaccia software, in particolare all'architettura del set di istruzioni (ISA). L'approccio Very Long Instruction Word (VLIW) incorpora intrinsecamente un certo grado di ILP nel software, diminuendo di conseguenza il carico della CPU nel massimizzare l'ILP e semplificarne la progettazione.

Parallelismo a livello di attività

Un approccio alternativo per migliorare le prestazioni computazionali prevede l'esecuzione simultanea di più thread o processi. Questo dominio di studio è chiamato calcolo parallelo. All'interno della tassonomia di Flynn, questa metodologia è classificata come Multiple Instruction, Multiple Data (MIMD).

Il multiprocessing (MP) rappresenta una tecnologia chiave utilizzata per questo obiettivo. La forma fondamentale di questa tecnologia è il Symmetric Multiprocessing (SMP), caratterizzato da un numero limitato di unità di elaborazione centrale (CPU) che condividono una visione della memoria unificata e coerente. Questo design architettonico incorpora hardware dedicato all'interno di ciascuna CPU per garantire la coerenza continua della memoria. La prevenzione degli stati di memoria obsoleti facilita la collaborazione della CPU su programmi condivisi e consente la migrazione dei programmi tra CPU diverse. Per aumentare il numero di CPU cooperanti oltre un numero modesto, negli anni '90 sono stati sviluppati protocolli NUMA (Non-Uniform Memory Access) e protocolli di coerenza basati su directory. Mentre le architetture SMP sono limitate a un numero limitato di CPU, i sistemi NUMA sono stati implementati con successo con migliaia di processori. Storicamente, i sistemi multiprocessore venivano costruiti utilizzando CPU distinte e circuiti stampati separati per stabilire la connettività tra processori. L'integrazione dei processori e la loro interconnessione su un singolo die di silicio definisce il multiprocessing a livello di chip (CMP), con il singolo chip risultante denominato processore multi-core.

I successivi progressi hanno rivelato la presenza di un parallelismo a grana più fine all'interno dei singoli programmi. Un singolo programma può comprendere più thread o funzioni in grado di essere eseguiti in modo indipendente o simultaneo. Le prime manifestazioni di questa tecnologia prevedevano l'implementazione di operazioni di input/output, come l'accesso diretto alla memoria, come thread distinti dal thread di calcolo primario. Un'applicazione più ampia di questa tecnologia è emersa negli anni '70 con la progettazione di sistemi in grado di eseguire più thread computazionali contemporaneamente. Questo paradigma tecnologico è denominato multi-threading (MT). MT è generalmente considerato economicamente più efficiente del multiprocessing, dato che richiede la replica solo di un insieme limitato di componenti della CPU, in contrasto con l'intera duplicazione della CPU richiesta per MP. All'interno di un'architettura MT, le unità di esecuzione e la gerarchia della memoria, comprese le cache, sono condivise tra più thread. Uno svantaggio significativo di MT è la maggiore visibilità dell'hardware sul software rispetto a MP, che richiede quindi modifiche più estese al software di supervisione, come i sistemi operativi, per un supporto efficace. Il multithreading temporale rappresenta una forma implementata di MT, in cui un thread viene eseguito finché non incontra uno stallo, in attesa del recupero dei dati dalla memoria esterna. Con questo paradigma, la CPU esegue rapidamente un cambio di contesto su un altro thread pronto, completando spesso la transizione entro un singolo ciclo di clock della CPU, come esemplificato da UltraSPARC T1. Il multithreading simultaneo costituisce un'altra variante MT, caratterizzata dall'esecuzione parallela di istruzioni da più thread all'interno di un singolo ciclo di clock della CPU.

Dagli anni '70 fino all'inizio degli anni 2000, l'obiettivo principale nello sviluppo di CPU generiche ad alte prestazioni era incentrato sulla massimizzazione del parallelismo a livello di istruzione (ILP) tramite tecniche tra cui pipelining, caching, esecuzione superscalare ed esecuzione fuori ordine. Questa traiettoria di sviluppo ha portato alla creazione di CPU sostanziali e ad alta intensità energetica, esemplificate dall'Intel Pentium 4. All'inizio degli anni 2000, gli architetti di CPU hanno riscontrato ostacoli significativi per ottenere ulteriori miglioramenti delle prestazioni dalle metodologie ILP, principalmente a causa della crescente divergenza tra le frequenze operative della CPU e della memoria principale, insieme alla crescente dissipazione di potenza della CPU attribuita a tecniche ILP sempre più complesse.

Successivamente, i progettisti di CPU hanno adottato concetti provenienti dai settori dell'informatica commerciale, come l'elaborazione delle transazioni, dove le prestazioni collettive di numerosi programmi, definite throughput computing, avevano un significato maggiore rispetto alle prestazioni di un singolo thread o processo.

Lo spostamento delle priorità di progettazione è dimostrato dalla diffusa adozione di architetture di processori multi-core, in particolare i recenti progetti di Intel che emulano l'architettura P6 meno superscalare. I processori contemporanei di varie famiglie incorporano il multiprocessing a livello di chip, esemplificato da x86-64 Opteron e Athlon 64 X2, SPARC UltraSPARC T1, IBM POWER4 e POWER5, insieme a diverse CPU per console per videogiochi come il PowerPC triple-core di Xbox 360 e il microprocessore Cell a sette core di PlayStation 3.

Parallelismo dei dati

Il parallelismo dei dati rappresenta un paradigma di elaborazione meno diffuso ma progressivamente significativo, che si estende all'informatica in generale. I processori discussi in precedenza sono classificati come dispositivi scalari. Al contrario, i processori vettoriali, come suggerisce la loro designazione, elaborano più elementi di dati all'interno di una singola istruzione, a differenza dei processori scalari che gestiscono un elemento di dati per istruzione. Secondo la tassonomia di Flynn, questi approcci di elaborazione dei dati sono generalmente classificati rispettivamente come flusso di istruzione singola, flusso di dati multipli (SIMD) e flusso di istruzione singola, flusso di dati singoli (SISD). Il vantaggio principale dei processori vettoriali è la loro efficacia nell'ottimizzare le operazioni che richiedono l'applicazione di una funzione identica (ad esempio, somma o prodotto scalare) a set di dati estesi. Applicazioni illustrative includono l'elaborazione multimediale (immagini, video e audio) e numerosi calcoli scientifici e ingegneristici. Mentre un processore scalare deve completare in sequenza le fasi di recupero, decodifica ed esecuzione per ciascuna istruzione e valore di dati in un set, un processore vettoriale può eseguire una singola operazione su un set di dati considerevolmente più grande utilizzando una singola istruzione. Questa efficienza si realizza quando un'applicazione prevede spesso l'applicazione di un'operazione uniforme a una raccolta sostanziale di dati.

Storicamente, i primi processori vettoriali, come Cray-1, venivano utilizzati prevalentemente nella ricerca scientifica e nelle applicazioni crittografiche. Tuttavia, con la diffusa digitalizzazione dei contenuti multimediali, l'integrazione delle funzionalità SIMD nei processori generici ha acquisito un'importanza sostanziale. In seguito alla diffusa adozione di unità a virgola mobile nei processori generici, durante la metà degli anni '90 sono emerse specifiche e implementazioni delle unità di esecuzione SIMD per questi processori. Le specifiche SIMD iniziali, incluse Multimedia Acceleration eXtensions (MAX) di HP e MMX di Intel, erano limitate alle operazioni con numeri interi. Questa limitazione ha rappresentato una sfida considerevole per gli sviluppatori di software, poiché molte applicazioni che beneficiano del SIMD coinvolgono principalmente calcoli in virgola mobile. Successivamente, gli sviluppatori hanno perfezionato in modo iterativo questi progetti fondamentali, portando alle specifiche SIMD contemporanee, che sono generalmente integrate all'interno di una specifica architettura del set di istruzioni (ISA). Esempi moderni di spicco includono Streaming SIMD Extensions (SSE) di Intel e AltiVec associato a PowerPC (noto anche come VMX).

Contatori delle prestazioni hardware

Le architetture contemporanee, inclusi i sistemi embedded, spesso incorporano contatori delle prestazioni hardware (HPC). Questi contatori facilitano la raccolta dati di basso livello, a livello di istruzione, il benchmarking, il debug e l'analisi delle metriche di esecuzione del software. L'HPC può essere utilizzato anche per rilevare ed esaminare comportamenti software anomali o potenzialmente dannosi, come gli exploit che coinvolgono la programmazione orientata al ritorno (ROP) o la programmazione orientata al sigreturn (SROP). Questa applicazione viene comunemente intrapresa dai team di sicurezza software per valutare e identificare programmi binari dannosi.

Numerosi fornitori leader, tra cui IBM, Intel, AMD e Arm, offrono interfacce software, generalmente implementate in C/C++, per estrarre le metriche delle prestazioni dai registri della CPU. Inoltre, gli sviluppatori di sistemi operativi forniscono utilità come perf (Linux) per registrare, confrontare o tracciare eventi della CPU sia nell'esecuzione del kernel che dell'applicazione.

I contatori hardware offrono un meccanismo a basso costo per l'acquisizione di parametri prestazionali estesi relativi ai componenti fondamentali di una CPU (ad esempio, unità funzionali, cache, memoria principale), rappresentando una notevole superiorità rispetto ai profiler software. Inoltre, in genere eliminano la necessità di modificare il codice sorgente di un programma. Date le variazioni architettoniche nelle progettazioni hardware, le categorie specifiche e le interpretazioni dei contatori hardware variano di conseguenza a seconda delle diverse architetture.

Modalità privilegiate

Le unità di elaborazione centrale (CPU) contemporanee incorporano comunemente modalità privilegiate per facilitare il funzionamento dei sistemi operativi e delle tecnologie di virtualizzazione.

All'interno degli ambienti di cloud computing, la virtualizzazione consente la fornitura di un'unità di elaborazione centrale virtuale (vCPU) a utenti distinti; è fondamentale differenziare una vCPU da un server privato virtuale (VPS).

Nei contesti di virtualizzazione, un host rappresenta la controparte virtuale di una macchina fisica, fungendo da piattaforma per il funzionamento di un sistema virtuale. Quando più macchine fisiche funzionano in modo collaborativo e sono gestite in modo coeso, le loro risorse di elaborazione e memoria combinate costituiscono un cluster. Alcuni sistemi consentono l'aggiunta e la rimozione dinamica di componenti da un cluster. Le risorse accessibili sia a livello di host che di cluster possono essere suddivise in pool di risorse finemente granulari.

Prestazioni

Le prestazioni o la velocità di un processore dipendono da numerose variabili, tra cui la frequenza di clock (tipicamente espressa in multipli di hertz) e le istruzioni per clock (IPC), che determinano collettivamente le istruzioni al secondo (IPS) che una CPU può eseguire. Molti dati IPS pubblicati riflettono i tassi di esecuzione "di picco" derivati ​​da sequenze di istruzioni sintetiche con ramificazioni minime. Al contrario, i carichi di lavoro autentici comprendono diverse istruzioni e applicazioni, alcune delle quali richiedono più tempo di esecuzione di altre. Inoltre, l'efficienza della gerarchia della memoria influenza in modo significativo le prestazioni del processore, un fattore spesso sottovalutato nei calcoli IPS. Di conseguenza, per valutare con precisione le prestazioni effettive nelle applicazioni tipiche, sono state ideate varie valutazioni standardizzate, comunemente chiamate "benchmark" (ad esempio SPECint).

Le prestazioni di elaborazione del computer vengono aumentate attraverso l'implementazione di processori multi-core, che fondamentalmente integrano due o più unità di elaborazione discrete (denominate core) su un singolo circuito integrato. In teoria, un processore dual-core dovrebbe avere quasi il doppio della potenza di un'unità single-core. Tuttavia, i miglioramenti pratici delle prestazioni sono notevolmente inferiori, in genere circa il 50%, attribuibili ad algoritmi e implementazioni software non ottimali. Un aumento del numero di core del processore (ad esempio, dual-core, quad-core) espande la capacità del sistema di gestire i carichi di lavoro. Ciò consente al processore di gestire un volume maggiore di eventi asincroni e interruzioni, che altrimenti potrebbero sovraccaricare la CPU in caso di sovraccarico. Concettualmente, questi nuclei possono essere paragonati a livelli distinti all'interno di un impianto di lavorazione, ciascuno dedicato a un compito specifico. In determinati scenari, nuclei adiacenti possono collaborare su attività identiche se un singolo nucleo si rivela insufficiente per elaborare i dati. Le CPU multi-core migliorano la capacità di un computer di eseguire più attività contemporaneamente fornendo potenza di elaborazione supplementare. Tuttavia, l'aumento di velocità risultante non è direttamente proporzionale al numero di core introdotti, principalmente perché la comunicazione tra core, facilitata attraverso canali specifici, consuma una parte della larghezza di banda di elaborazione disponibile.

Le CPU moderne possiedono funzionalità avanzate come il multithreading simultaneo e le architetture uncore, che comportano la condivisione delle risorse effettive della CPU per massimizzare l'utilizzo. Di conseguenza, il monitoraggio dei livelli di prestazioni e dell’utilizzo dell’hardware si è evoluto in un’impresa più complessa. In risposta, alcune CPU incorporano una logica hardware supplementare progettata per tracciare l'utilizzo in tempo reale di vari componenti della CPU e fornire contatori accessibili dal software; La tecnologia Performance Counter Monitor di Intel esemplifica questo approccio.

Overclock

L'overclocking comporta l'aumento della velocità di clock di un'unità di elaborazione centrale (CPU) e di altri componenti oltre i valori specificati dal produttore. L'aumento della frequenza di clock di un componente comporta un numero maggiore di operazioni eseguite al secondo. Tuttavia, l'overclocking può portare a temperature elevate della CPU e potenziale surriscaldamento, motivo per cui la maggior parte degli utenti si astiene da questa pratica, mantenendo le velocità di clock predefinite. Inoltre, alcune varianti di componenti, come le CPU della serie U di Intel o le GPU OG di Nvidia, sono progettate per impedire l'overclocking.

Note

Note

Riferimenti

Çavkanî: Arşîva TORÎma Akademî

Su questo articolo

Che cos’è Unità centrale di elaborazione?

Una breve guida a Unità centrale di elaborazione, alle sue caratteristiche principali, agli usi e ai temi correlati.

Tag dell’argomento

Che cos’è Unità centrale di elaborazione Unità centrale di elaborazione spiegato Concetti base di Unità centrale di elaborazione Articoli di Tecnologia Tecnologia in curdo Temi correlati

Ricerche comuni su questo tema

  • Che cos’è Unità centrale di elaborazione?
  • A cosa serve Unità centrale di elaborazione?
  • Perché Unità centrale di elaborazione è importante?
  • Quali temi sono collegati a Unità centrale di elaborazione?

Archivio categoria

Archivio di Tecnologia - Torima Akademi Neverok

Esplora l'ampio archivio di Torima Akademi dedicato alla Tecnologia. Qui troverai articoli dettagliati, spiegazioni chiare e approfondimenti sulle ultime innovazioni e sui concetti fondamentali che plasmano il nostro

Home Torna a Tecnologia