Esecuzione parallela usando la GPU



INTRODUZIONE

Le unità di elaborazione grafica (GPU) , o più popolarmente chiamate Schede Video, sono state sviluppate per far fronte alle elevate esigenze di prestazioni grafiche e di animazione. 

Hanno un'architettura diversa rispetto alle CPU, supportando al meglio operazioni in virgola mobile, concorrenza e memoria ad alta velocità di trasmissione dati. 

Oramai da diversi anni è stato riconosciuto che le GPU possono eseguire operazioni parallele di dati ad alta velocità. Di solito le GPU sono dedicate a compiti grafici come l'ombreggiatura dei pixel, o una combinazione di attività grafiche e di elaborazione, ma con l'avvento della "sete" di potenza da parte degli algoritmi di cifratura usati nel mondo delle cryptovalute, sono comparse GPU che fanno semplicemente calcolo. 


Solo in determinate GPU è possibile sviluppare del codice all'interno. Diverse architettue supportano diversi linguaggi. Per esempio le GPU NVIDIA sono compatibili con il sistema chiamato CUDA, le AMD e INTEL supportano il sistema OpenCL 

Di solito una GPU contiene un numero variabile di multiprocessori ciascuno con un numero di core
Un core ha hardware per contenere lo stato di N lotti di thread
Dato che ogni core segue un criterio Single Instruction Multiple Threads la singola istruzione viene eseguita da tutti i thread. 

JAVA

In JAVA esistono librerie che effettuando il bind di esistenti librerie scritte in altri linguaggi. In pratica la libreria fa solo da passa carte verso altre.

Ho scoperto personalmente che esisteva un progetto, sviluppato anni fa, dove traduceva runtime il bytecode e veniva eseguito all'interno della scheda video. 

Per funzionare serviva solo aggiungere un' annotation sulla funzione da parallelizzare per indicare cosa eseguire all'interno della scheda video.

La libreria è stata portata da me su github e tradotta introducendo maven


PYTHON

Anche su python ho trovato una libreria che permette di annotare un metodo per inviare alla scheda video il codice.

Guardate questo video per una dimostrazione di utilizzo


QUANDO USARLA?

Un uso tipico di una libreria di questo tipo avviene quando lo sviluppatore scrive dei cicli con un dataset molto grande e ogni ciclo scrive un dataset che non dipenda da altre iterazioni. Il parallelismo dato dalla struttura GPU permette di avere un risparmio in termini di tempo di esecuzione veramente considerevole!

Provare per credere!

Commenti

Post popolari in questo blog

Hadoop, how to create a single node cluster using docker

How to install IOTA node with docker

Apache Spark - Try it using docker!