Pag 2

CUDA, il nuovo linguaggio di programmazione per le GPU Nvidia, promette grandi risultati e mostra le schede video sotto una nuova luce. Cerchiamo di capire un po' di più cosa ci riserva CUDA.

Avatar di Andrea Ferrario

a cura di Andrea Ferrario

Editor in Chief

CUDA dal punto di vista hardware, continua

Quest'area di memoria permette ai thread presenti nello stesso blocco di comunicare tra loro. É importante enfatizzare questo concetto: tutti i thread presenti nello stesso blocco sono eseguiti dallo stesso multiprocessore. L'assegnamento dei blocchi ai vari multiprocessori, invece, è del tutto separato, il che significa che due thread di blocchi differenti non possono comunicare tra loro durante la loro esecuzione. L'uso della memoria, quindi è piuttosto complicato, ma non per questo è poco efficiente. Eccezione fatta per i casi in cui diversi thread cerchino di accedere allo stesso banco di memoria, creando conflitti, l'accesso alla memoria condivisa è veloce quanto l'accesso ai registri.

La memoria condivisa non è la sola memoria a cui i multiprocessori possono accedere. Possono, naturalmente, fare appello anche alla memoria video, anche se questa ha un bandwidth più basso e una latenza più alta. Quindi per limitare accessi troppo frequenti a questa memoria, Nvidia ha dotato i suoi multiprocessori con una cache (8 kb per multiprocessore) per l'accesso alle costanti e alle texture.

I multiprocessori hanno anche 8192 registri condivisi tra tutti i thread di tutti i blocchi attivi in un multiprocessore. Il numero dei blocchi attivi per multiprocessore non può essere maggiore di otto, e il numero dei warp attivi è limitato a 24 (768 thread). Quindi, una 8800 GTX può elaborare fino a 12228 thread nello stesso istante. Questo limite è stato impostato per aiutare il dimensionamento degli algoritmi in funzione delle risorse disponibili.

Ottimizzare un programma CUDA, quindi, vuol dire inizialmente trovare il miglior rapporto tra il numero di blocchi e la loro dimensione - più thread per blocco saranno utili per mascherare la latenza delle operazioni in memoria, ma allo stesso tempo il numero di registri disponibili per ogni thread è ridotto. Un blocco di 512 thread, inoltre, risulterebbe particolarmente inefficiente, poiché su un multiprocessore può essere attivo un solo blocco, e potenzialmente si sprecheranno 256 thread. Quindi, Nvidia consiglia di usare blocchi composti da 128 a 256 threads, dimensione che offre il miglior compromesso per mascherare la latenza e il numero di registri necessario per la maggior parte dei kernel.