Il nuovo ruolo delle Gpu

PROCESSORI –

Considerata la facilità di programmazione, la potenza di calcolo offerta, il basso costo di acquisto e il minor costo di sviluppo associato, i processori multicore sono ormai preferibili in molte applicazioni fino a poco tempo fa dominate dagli Fpga.

Dispositivi multicore come le Gpu (Graphics Processing Units) o i processori Tilera (fino a 100 core nel loro ultimo Tile-Gx) sono considerati candidati sempre più autorevoli per la sostituzione di Fpga, almeno in certe applicazioni. Le Gpu sono utilizzate già da qualche tempo per l'accelerazione di applicazioni generiche, e non più solo per la grafica 3D; è il fenomeno del cosiddetto Gpgpu (General Purpose computing on Graphics Processing Units), di cui l'esempio più noto è rappresentato dalla tecnologia Cuda di nVidia. Nel valutare quale di queste tecnologie tra Gpgpu, Tile o Fpga sia preferibile per una data applicazione ci sono diversi fattori da tenere in considerazione. Tra questi, la disponibilità di potenza di calcolo, la latenza, la scalabilità, i costi di sviluppo, l'aggiornabilità e il prezzo.

La potenza di calcolo
Questo fattore è influenzato dal tipo di dati da elaborare e dall'algoritmo utilizzato. Le Gpu sono specializzate nella gestione di dati in virgola mobile (floating point), tanto a precisione singola (SP), cioè 32 bit, quanto, in alcuni casi, a doppia precisione (DP), 64 bit. I processori Tilera, al contrario, non supportano in modo nativo le operazioni in virgola mobile, e devono necessariamente ricorrere a un'emulazione software, che impatta pesantemente sulle prestazioni. In generale nemmeno gli Fpga si comportano molto bene con le operazioni FP, che su queste macchine impegnano molte risorse. A titolo di esempio, l'attuale generazione di Gpu Tesla arriva a 1 Tflops (1012 operazioni FP al secondo), mentre i Virtex 6 si fermano a quota 150 Gflops. Quando però si considerano dati a virgola fissa, lo scenario cambia leggermente. Le Gpu di ultima generazione eseguono operazioni sugli interi alla stessa velocità con cui eseguono operazioni FP, cioè 1 Tops, mentre i Virtex 6 sono più veloci sugli interi, recuperando parte dello svantaggio (500 Gops), e anche i processori Tilera Tile hanno nelle performance sugli interi il loro punto di forza; si arriva, in questo caso, a 750 Gops per dati a 8 bit e a 188 Gops per dati a 32 bit. L'utilizzo di processori a virgola fissa nel signal processing può allungare i tempi di sviluppo, dato che, per evitare overflow o underflow, è necessario definire in modo preciso il range del segnale al momento della definizione delle specifiche o, in alternativa, implementare un monitoraggio in run-time e intervenire sui fattori di scala. Nel caso delle operazioni su singoli bit, l'ago della bilancia pende decisamente in favore degli Fpga, dato che gli overhead nell'eseguire queste operazioni su processori più "general purpose" sono significativi. Anche in questo caso vanno però considerati attentamente i tempi di sviluppo. È poi noto, e questo vale per ogni sistema, che la potenza di calcolo realmente ottenibile può differire notevolmente dal picco teorico massimo. Tra i principali fattori responsabili di questo scostamento, l'aderenza/ottimizzazione dell'algoritmo all'architettura hardware e il tempo speso a ottimizzare l'implementazione. Per esempio, gli Fpga possono arrivare molto vicini al loro massimo teorico grazie alla caratteristica abilità di sfruttare il parallelismo e all'adattabilità a un'ampia varietà di algoritmi; di contro, richiedono grossi investimenti e lunghi tempi di sviluppo. Le Gpu hanno dimostrato poter raggiungere il 20-30% del valore massimo in presenza di algoritmi che sfruttano l'elevato parallelismo dell'hardware, e hanno tempi di sviluppo ragionevoli. Le Cpu TilePro64 offrono sia l'adattabilità degli Fpga sia la programmabilità della Gpu, ma non raggiungono gli stessi livelli di parallelismo delle altre due architetture. Molto importante, nel determinare le performance di un sistema, anche la banda passante disponibile tra Cpu e memoria. Su questo versante, le Gpu sono avvantaggiate disponendo tipicamente del triplo della banda passante rispetto agli Fpga e di 6 volte quella dei TilePro64.

La latenza
La latenza è probabilmente il principale fattore che gioca a sfavore delle Gpu. A causa di fattori quali il tempo necessario per invocare il kernel o i lunghi tempi di accesso alla memoria principale, si può incorrere in latenze elevate. Quando latenze ridotte sono obbligatorie (ad esempio controlli ad anello chiuso), gli Fpga rappresentano la scelta di riferimento. A questo proposito va però aggiunto che, proprio per ragioni di ottimizzazione delle latenze, la memoria degli Fpga deve essere totalmente gestita dallo sviluppatore, mentre le Gpu e il TilePro64 beneficiano di un'architettura cache tradizionale che gestisce il problema delle latenze in modo trasparente, senza allungare i tempi di sviluppo.

La scalabilità
Gli Fpga possono essere strettamente legati a link con bassi overhead come Aurora, o possono implementare soluzioni industriali standard come Serial RapidIO o Pci Express. Le Gpu sono di fatto coprocessori, pertanto richiedono sempre un processore host. Più Gpu possono essere gestite da un singolo processore host (preferibilmente multicore), ma la condivisione di risorse può essere limitante raggiunto il limite di una Gpu per ogni core della Cpu host. Una via comune all'utilizzo di più Gpu è OpenMP, che consente l'esecuzione automatica di più threads su differenti Gpu. Scalabilità ancora maggiori si ottengono a livello di cluster (host + Gpu) connessi attraverso bus Pci Express, 10G Ethernet, Infiniband o altro. I processori Tile sono intrinsecamente orientati alla scalabilità. Connessioni tra dispositivi possono essere realizzate ancora attraverso 10G Ethernet e Pci Express. L'intero device, che è in effetti un cluster di molti core, può essere programmato come un dispositivo Smp (Symmetrical Multi Processing).

I costi di sviluppo
Disquisire in generale sui costi di sviluppo è molto difficile.
Qualitativamente, è assodato che programmare un dispositivo multicore in C o C++ è un compito relativamente semplice, che molti tecnici qualificati possono svolgere efficacemente, mentre è più difficile trovare personale per programmare Fpga in Vhdl o Verilog (dovendo progettare in questo caso software e hardware, sono richieste competenze maggiori). Quantificare economicamente questa differente condizione è però problematico. Un metodo può essere il conteggio delle righe di codice (Source Lines of Code). Questo dato varia ovviamente molto con l'algoritmo ma un rapporto 3:1 a favore dei processori multicore non è inusuale. Il conto delle righe di codice non dice però tutta la verità, dato che molti strumenti che hanno dato notevole impulso alla produttività degli sviluppatori multicore (ambienti di sviluppo integrati, debugger evoluti, programmazione a oggetti) sono ancora molto immaturi nel mondo Fpga. Inoltre, nel caso degli Fpga, le verifica del codice scritto e le simulazioni sono tutt'altro che immediate, come invece accade per i processori multicore.

L’aggiornabilità
Dal lato delle applicazioni, il codice scritto per le Gpu può beneficiare di nuovo hardware con pochissime o - spesso - nessuna modifica, dato che il livello di parallelismo dell'hardware viene astratto a livello di driver runtime. La migrazione verso nuove piattaforme è, quindi, generalmente indolore. Lo stesso dicasi per i processori Tile: le applicazioni scalano su più core man mano che nuovi dispositivi a più core si rendono disponibili. Al contrario, migrare un'applicazione Fpga su un nuovo dispositivo richiede una gran mole di lavoro sul codice implementato in hardware, perfino se l'algoritmo rimane lo stesso.

I costi di acquisto
Il prezzo di schede Gpgpu commerciali parte da 50 dollari e può arrivare, nei casi limite di schede destinate a supercomputer, a 4000 dollari. Una scheda Fpga "high-end" Virtex 6 si aggira sui 4000 dollari, mentre una scheda Tilera costa tipicamente molto di più, anche a causa del mercato di nicchia in cui opera. Sempre a causa dei ridotti volumi produttivi, oltreché delle procedure di verifica e controllo, versioni rugged possono costare molto di più, in tutti e tre i casi. Ad esempio una scheda Gpgpu "fully ruggedized" per applicazioni militari e aerospazio può arrivare a 7000 dollari.

Applicazioni diversificate
Rimangono tutt'oggi molti i casi in cui gli Fpga forniscono prestazioni inarrivabili in termini di potenza di calcolo e latenze ridotte, ma esistono ormai anche numerose applicazioni per le quali i processori multicore possono e devono essere presi in considerazione. I processori Tile possono essere considerati dei sostituti degli Fpga, mentre le Gpu, grazie alle loro ottime performance con dati in virgola mobile, possono essere considerati tanto un'alternativa quanto un complemento agli Fpga. Alcune applicazioni che in precedenza erano migrate dalle Cpu generiche agli array Fpga, ora iniziano a migrare verso piattaforme multicore. Ad esempio, macchine medicali come le Tac o le Nmr oggi utilizzano non di rado Gpgpu per il rendering delle immagini. Anche all'interno di sistemi radar che attualmente implementano un mix di Fpga e Gpp si sta studiano con attenzione la possibilità di utilizzare Gpgpu per ridurre peso, ingombri e potenza dissipata, cosa che aprirebbe la via a sistemi più portabili. Un altro esempio sono le applicazioni di analisi ambientale che utilizzano oggi comunemente processori Tile e Gpu per elaborare la mole di dati provenienti dalle telecamere.

Pubblica i tuoi commenti