CUDA
Cos'e' CUDA?
CUDA è un linguaggio di programmazione sviluppato dalla nVidia: un programma scritto in CUDA gira su GPU sfruttando appieno le potenzialità dell'altissima parallelizzazione dell'architettura delle schede video. Permette, quindi, di scrivere programmi estremamente performanti, laddove sia possibile parallelizzare.
Qualche info sui nodi CUDA
Attualmente nel cluster di Lcm sono presenti dei nodi che permettono il computing parallelo con CUDA. I nodi con le loro relative schede sono i seguenti:
LCM 1 (CUDA 6.5): - Spyro || GTX 480 - Sonic || GTX 480 - Crash || GTX 480 - Duke || GTX 480 - Abe || QUADRO 600 - Pong || QUADRO 600 FARM (accessibili a tutti) - Jacobi (CUDA 7.5) || 3 * GTX 480 + Tesla C2075 - Yukawa (CUDA 6.5) || 2 * GTX 480 + Tesla C1060 FARM (solo con relativo account) - Tesla || 2 * Tesla C2075 + QUADRO NVS 295 (per output grafico) - Hamilton || 2 * Tesla M2070
Importante: come si utilizza
L'utilizzo di cuda (al di là della scrittura del codice e della conoscenza del relativo linguaggio) è molto semplice. Sul cluster tutte le librerie sono correttamente linkate, quindi è sufficiente richiamare il compilatore:
nvcc nomefile.cu -o nomeprogramma
Una piccola nota: le GPU nVidia sono caratterizzate da diverse "compute capabilities" (vedi il sito dell'nVidia per ulteriori informazioni). Sul cluster non tutte le schede condividono la stessa architettura e la stessa compute capabilities. Nel particolare le schede sono di quattro tipologie di compute capabilities:
- 1.2 (GT210, la maggior parte delle macchine del cluster);
- 1.3 (Tesla C1060, su Yukawa);
- 2.0 (GTX480 e Tesla C2070);
- 2.1 (Quadro600).
Su Yukawa sono presenti schede con compute capabilities molto diverse (1.2 e 2.0): il compilatore, senza alcuna specifica, potrebbe compilare per la 2.0. Il codice generato potrebbe dare risultati strani sulla Tesla. Per sicurezza conviene forzare il compilatore con l'opzione "--gpu-architecture=sm_12": in tal modo il codice generato funzionerà perfettamente anche sulla Tesla.
Ogni volta che cambi macchina ricompila il programma: l'eseguibile generato su Jacobi (CUDA 7.5 e schede nuove) potrebbe non funzionare correttamente su una macchina con CUDA 6.5 e schede diverse!
Link Utili
Introduzione a Cuda = http://docs.nvidia.com/cuda/index.html
Introduzione alla programmazione multithread = http://wwwteor.mi.infn.it/~vicini/CUDA/doc/CUDA_C_Programming_Guide.pdf
Un po' di pratica = http://wwwteor.mi.infn.it/~vicini/CUDA/doc/CUDA_C_Best_Practices_Guide.pdf