# Coprocessore

Il coprocessore è una tipologia di processore che si contraddistingue per essere ausiliaria ad un altro processore. I coprocessori permettono inoltre ai costruttori di computer di offrire dei sistemi personalizzati, offrendo la potenza supplementare solo ai clienti che realmente la necessitano e pagano per essa. I coprocessori hanno fatto la loro prima comparsa nei mainframe degli anni sessanta, generalmente utilizzati per svolgere calcoli in virgola mobile ma anche per controllare i canali di I/O.

## Storia

Nati come chip per aiutare nei calcoli i processori dei grossi mainframe, i coprocessori per l'aritmetica in virgola mobile divennero comuni nei computer desktop degli anni ottanta e dei primi anni novanta. I primi processori ad 8 bit e 16 bit utilizzavano processi software per eseguire le operazioni in virgola mobile: nei sistemi in cui un coprocessore matematico era supportato sia dall'hardware che dal software, tali calcoli potevano essere eseguiti molto più velocemente. I coprocessori matematici erano un acquisto comune per tutti quegli impieghi in cui si richiedeva una elevata potenza elaborativa per trattare complessi numero in virgola mobile come nei software di CAD ed in quelli scientifici ed ingegneristici. I primi coprocessori matematici, come l'AMD 9511, l'Intel 8231 e quelli prodotti da Weitek, erano trattati come dispositivi periferici, mentre le ultime versioni, come l'Intel 8087, il Motorola 68881 ed il National 32081, erano molto più integrate con la CPU.
Un altro tipo di coprocessore che divenne comune durante quegli anni fu quello preposto alla gestione semplice del video, come l'ANTIC degli Atari ad 8 bit, il TMS9918 dei computer MSX e del Texas Instruments TI-99/4A: tutti questi processori erano chiamati Video Display Controller o VDC. Un esempio di processore grafico vero e proprio è il Copper dei Commodore Amiga, una macchina a stati finiti programmabile ("Copper" sta infatti per "Co-processor") che poteva eseguire un flusso di istruzioni sincronizzate con l'hardware video.
Lo sviluppo dei microprocessori rese col tempo sempre meno costosa l'integrazione di una unità di calcolo in virgola mobile direttamente nella die del chip per cui l'uso di coprocessori matematici esterni lentamente declinò. Uno degli ultimi coprocessori esterni è l'Intel 80387 mentre una delle prime CPU che integra una FPU è l'Intel 80486. Attualmente il loro uso nei computer desktop è ormai del tutto abbandonato mentre, invece, è sempre più vivo il bisogno di coprocessori grafici particolarmente potenti (le GPU) per il sempre più elevato numero di calcoli richiesti dai giochi in 3D.

## Funzioni

La funzione del coprocessore è quella di alleggerire il carico di lavoro del processore di cui è ausiliario. Di norma, il carico di lavoro relativo a particolari elaborazioni. Spesso il coprocessore è quindi un processore ottimizzato e specializzato nell'esecuzione di particolari elaborazioni in modo da risultare più efficiente nei compiti che gli sono stati affidati. Comuni sono i coprocessori dell'unità di elaborazione centrale, infatti nei computer contemporanei la CPU è spesso affiancata da processori ausiliari come la GPU e la FPU. Le operazioni eseguite possono essere calcoli in virgola mobile, funzioni grafiche, gestione dei segnali, elaborazione dei dati o funzioni crittografiche. Alleggerendo il processore principale dai compiti più gravosi, i coprocessori possono accelerare le prestazioni di un sistema.
Un coprocessore può non essere un processore di utilizzo generale: ad esempio, alcuni coprocessori non possono eseguire istruzioni in memoria, eseguire istruzioni di controllo del flusso del programma oppure operazioni di input/output, gestire la memoria. Questi chip richiedono che il processore processi le loro istruzioni e gestisca tutte le operazioni legate alle funzioni che essi devono svolgere. In alcune architetture il coprocessore è più un computer di uso generale ma impostato per svolgere solo alcune limitate funzioni sotto il controllo diretto di processore che ne supervisiona i compiti.

## Tipologie

Tipologie particolari di coprocessori sono le seguenti:
* coprocessore matematico;
* unità di elaborazione grafica;
* controller di periferica.

### Coprocessore matematico

Il coprocessore matematico è un coprocessore ottimizzato e specializzato in particolari calcoli matematici. I primi coprocessori matematici della storia erano componenti separate dall'unità di elaborazione centrale. Oggi, normalmente, il coprocessore matematico e l'unità di elaborazione centrale sono integrati nel medesimo microprocessore. Attualmente la tipologia di coprocessore matematico più diffusa è l'unità di calcolo in virgola mobile (più conosciuta con l'acronimo mutuato dalla lingua inglese "FPU"), coprocessore matematico specializzato nei calcoli in virgola mobile. Tutte le moderne unità di elaborazione centrale sono affiancate da un'unità di calcolo in virgola mobile, ed entrambe sono implementate nel medesimo circuito integrato.

### Unità di elaborazione grafica

L'unità di elaborazione grafica (più conosciuta con l'acronimo mutuato dalla lingua inglese "GPU") è un coprocessore ottimizzato e specializzato nel rendering di immagini grafiche. Da alcuni anni è in atto la tendenza ad implementare l'unità di elaborazione grafica e l'unità di elaborazione centrale nel medesimo circuito integrato.

### Controller di periferica

Il controller di periferica o processore di input/output è un coprocessore adibito alla gestione di una o più periferiche. Il controller di periferica è presente sin dalla prima generazione di computer elettronici in quanto normalmente la periferica è molto più lenta dell'unità di elaborazione centrale. La presenza del controller di periferica evita quindi che l'unità di elaborazione centrale subisca pesanti rallentamenti: sollevata dalla gestione delle periferiche, l'unità di elaborazione centrale è libera di utilizzare tutta la sua capacità di calcolo in compiti in cui è richiesta tale capacità.

## Coprocessori Intel

Il PC IBM originale includeva uno zoccolo per il coprocessore matematico (FPU) Intel 8087, scelto generalmente dagli utenti del computer che lo usavano per eseguire CAD o programmi con elevati calcoli numerici: quel coprocessore accelerava i calcoli in virgola mobile di 50 volte. Gli utenti che usavano il computer per compiti da ufficio, ad esempio con programmi di videoscrittura, situazioni in cui l'uso del coprocessore non avrebbe sortito benefici, potevano evitarne l'acquisto contenendo il costo del computer.
L'8087 era ben integrato con l'Intel 8086/8088, intercettando gli opcode delle operazioni in virgola mobile presenti nel codice macchina in esecuzione sulla CPU. Invece, un processore 8088 senza 8087 interpretava quelle istruzioni come interrupt interni che potevano essere gestiti per sollevare un evento di errore o per attivare un emulatore software delle istruzioni dell'8087.
Un altro coprocessore per le CPU 8086/8088 era l'Intel 8089, deputato alla gestione dell'input/output. Esso usava la stessa tecnica di programmazione dell'8087 per gestire le operazioni di I/O quali il trasferimento dei dati dalla memoria ad un dispositivo periferico, riducendo così il carico sulla CPU. IBM però non usò tale coprocessore per cui Intel decise di abbandonarne la produzione.
Durante l'era dei computer desktop ad 8 e 16 bit altri coprocessori matematici molto diffusi erano quelli di Weitek, nota soprattutto per i coprocessori per 80386 serie 1067. Questa diffusione fu dovuta al fatto che Intel rilasciò una propria FPU per il processore, l'Intel 80387, quasi 2 anni dopo la sua introduzione.
Il processore 486DX includeva una FPU sul chip. Intel produsse anche una versione più economica del processore, il 486SX: rispetto al modello DX si differenziava solo per l'assenza di tale unità per calcoli in virgola mobile. Contemporaneamente al 486SX presentò anche il coprocessore 487SX che essenzialmente sostituiva il processore principale quando veniva installato dato che il 487SX era un 486DX completo con una piedinatura differente.
I processori Intel successivi al 486 integravano la FPU direttamente nel chip grazie alla riduzione dei costi derivante dall'evoluzione tecnica dei processi produttivi, eliminando così i vantaggi economici nell'avere un coprocessore matematico esterno. Inoltre sarebbe stato molto difficile adattare le tecniche di progettazione delle circuiterie esterne adeguate alla gestione di un processore a 75 MHz ai tempi di attesa, al consumo elettrico ed agli standard di interferenze elettromagnetiche richieste dalle velocità delle CPU moderne, operanti a diversi Gigahertz. Le FPU integrate nei processori sono ancora indicate come coprocessori perché esse operano in parallelo alla CPU principale.

## Coprocessori Motorola

La famiglia di processori Motorola 68000 aveva i suoi coprocessori dedicati: essi erano i Motorola 68881/68882, che fornivano funzionalità di accelerazione dei calcoli in virgola mobile come i corrispondenti Intel. I computer che usavano le CPU della serie 68000 ma che non montavano il coprocessore potevano gestire delle eccezioni per attivare un emulatore software delle istruzioni in virgola mobile che, anche se con prestazioni inferiori, permettevano di avere un'unica versione del programma distribuito per entrambi i casi.

## I coprocessori nei moderni PC

I coprocessori grafici o GPU, intesi come processore montato su una scheda grafica addizionale, cominciano a fare la loro apparizione nella metà degli anni '90, quando produttori del calibro di Matrox, powerVR, 3dfx, nVIDIA, S3 ed altri immetterono sul mercato delle schede appositamente studiate per accelerare la gestione della grafica 2D/3D. Attualmente le GPU hanno una complessità ed una potenza di calcolo alle volte superiori a quelle dei più veloci microprocessori.
Alcuni modelli di schede audio sono state equipaggiate di processori dedicati capaci di miscelare il segnale digitale multicanale ed applicare effetti audio in tempo reale già agli inizi degli anni '90: esempi di tali schede sono la Gravis Ultrasound e la Sound Blaster AWE32. Le schede Sound Blaster Audigy e Sound Blaster X-Fi sono esempi più recenti di tali applicazioni.
Nel 2006 AGEIA ha annunciato una scheda aggiuntiva per i computer denominata PhysX: essa è progettata per eseguire complessi calcoli fisici così da alleggerire i compiti della CPU e della GPU e destinare la loro potenza ai restanti calcoli. Nel 2008 Nvidia ha acquistato i diritti sulla scheda ed ha iniziato ad integrarne le funzionalità suoi chip, sviluppando la tecnologia CUDA che lavora in maniera simile.
Sempre nel 2006 BigFoot Systems ha presentato una scheda denominata "KillerNIC" che eseguiva un suo kernel Linux su un sistema FreeScale PowerQUICC a 400 MHz. Il chip FreeScale era denominato Network Processing Unit o NPU.
Nella seconda metà degli anni 2000 è stata sviluppata la nuova tecnologia Cell, una microarchitettura per processore di impiego generico, dai dispositivi embedded ai mainframe, supportanti il calcolo parallelo.
Nel 2008 Apple e poi Khronos Group ha presentato la libreria OpenCL, che supporta una gran varietà di dispositivi quali CPU, GPU ed altri processori.

## Altri coprocessori

* Gli FPGA (field-programmable gate arrays) sono coprocessori personalizzabili, che possono essere programmati per svolgere qualunque compito;
* gli acceleratori TLS/SSL sono usati sui server per le connessioni cifrate;
* alcuni chip multi core possono essere programmati in modo tale che un processore sia quello principale e gli altri vengano gestiti come coprocessori.