Architetture dei processori/Processore vettoriale

Wikibooks, manuali e libri di testo liberi.
Jump to navigation Jump to search
Pipeline di un processore vettoriale, dopo la decodifica dei dati la pipeline continua a processare dati senza dover decodificare altre istruzioni

Un processore vettoriale o array processor è una CPU progettata per svolgere operazioni matematiche su più dati elementari contemporaneamente. Questo in contrasto con l'architettura classica di un processore scalare che prevede l'elaborazione di un singolo dato per volta. La maggior parte dei processori sono scalari (o esternamente lo sembrano). I processori vettoriali sono comuni nelle applicazioni scientifiche e sono spesso alla base dei supercomputer fin dagli anni 80. Con la fine degli anni 90 i microprocessori sono cresciuti di prestazioni e molti processori per applicazioni generiche si sono dotati di unità vettoriali o sono diventati vettoriali al loro interno. Nel 2000 IBM Toshiba e Sony hanno iniziato lo sviluppo del processore Cell, un microprocessore ad elevate prestazioni dotato di svariate unità vettoriali e rivolto ad applicazioni che spaziano dalle consolle al supercalcolo.

Attualmente praticamente ogni CPU moderna include istruzioni vettoriali tipicamente conosciute come istruzioni SIMD. Le consolle per i videogiochi e le schede grafiche fanno un ampio uso di processori vettoriali dato che l'elaborazione di flussi audio e video in tempo reale è un campo che ben si presta all'elaborazione vettoriale.

Vantaggi[modifica]

Dato che un'unica operazione vettoriale opera su più dati contemporaneamente questo consente di leggere meno dati rispetto a un classico processore. I dati vettoriali sono tra di loro indipendenti e quindi si possono realizzare CPU con un elevato parallelismo, con unità di controllo più semplici e quindi con pochi transistor. Un numero ridotto di transistor consente di ottenere frequenze di funzionamento elevate. Essendo il compilatore che provvede a ridurre le dipendenze, le unità di gestione diventano ancora più semplici. Le istruzioni vettoriali accedono alla memoria secondo schemi noti quindi si possono ottimizzare gli accessi dato che i dati vengono salvati in ampi registri vettoriali. Inoltre queste unità possono fare a meno di cache dati.

Architettura[modifica]

Internamente un processore vettoriale è formato da un'architettura basata su registri vettoriali. Ogni registro vettoriale è composto da un insieme di registri caratterizzati da un unico nome e un indice che permette di accedere al singolo dato. Le operazioni vettoriali lavorano unicamente tra registri vettoriali tranne ovviamente le operazioni di load e di store che provvedono a caricare e scaricare i dati dai registri verso la memoria.

I componenti di un processore vettoriale sono:

  • CPU scalare: Questa unità è composta da registri, logica per la lettura delle istruzioni e della loro decodifica.
  • Registri vettoriali: Questi registri sono formati da un insieme di registri accorpati per nome e indirizzabili tramite un indice. Sono dotati di almeno due porte di lettura e di una di scrittura e possono essere da 8 fino a 32. A volte i registri supportano parole di lunghezza variabile (8,16,32,64 bit) questo risulta comodo per applicazioni multimediali.
  • Unità funzionale vettoriale: Questa unità è di tipo pipeline per poter iniziare una nuova operazione ogni ciclo di clock. Tipicamente ne esistono da 2 a 8 in grado di lavorare su interi o su numeri in virgola mobile.
  • Unità vettoriale di load-store: Questa unità è un'unità pipeline che provvede a leggere e scrivere i dati dai registri alla memoria. L'unità può leggere o scrivere più dati in contemporanea e in un processore possono esserci più unità di load-store.
  • Matrice di commutazione: Questa matrice mette in comunicazione le varie unità funzionali del processore.

Metodi di accesso[modifica]

L'unità vettoriale di load-store usualmente supporta almeno tre modalità di accesso.

  • Metodo di accesso a passo unitario, il più veloce.
  • Metodo di accesso a passo costante
  • Metodo di accesso indicizzato. Accede alla memoria tramite un indice, è molto utile per accedere alle matrici sparse e permettere di vettorializzare molti programmi

Svantaggi[modifica]

Questi processori sono poco adatti all'elaborazione di dati distribuiti in modo non costante e quindi le loro reali prestazioni dipendono dalla tipologia di programma in esecuzione e in alcuni casi anche dai dati trattati.

Unità vettoriali[modifica]

Tutti i processori moderni supportano operazioni vettoriali. Questo perché i processori classici mal si prestano all'elaborazione di dati multimediali. L'utilizzo di chip dedicati per l'elaborazione multimediali non ha mai preso piede dato che questi chip sono limitati nell'utilizzo, complicano lo sviluppo dei computer e non sono mai stati ben supportati dal software. Invece l'inclusione di queste unità nei processori moderni permette di migliorare le prestazione nel campo del multimedia senza incrementare i costi in modo significativo. Difatti basta aggiungere qualche registro (o utilizzarne alcuni poco usati come quelli del processore matematico), modificare le pipeline in modo da poter gestire gruppi di dati in parallelo e aggiungere la decodifica di alcune istruzioni in più.