Per CUDA si intende sia l’architettura sia il sottoinsieme del linguaggio c (con alcune estensioni) che usati insieme permettono la computazione parallela (ove possibile) di codice general-purpose su GPU Nvidia. In pratica ti permettono di eseguire calcoli arbitrari nella GPU sgravando di tale compito la CPU. Nei casi dove il programma che si vuole scrivere contenga delle parti la cui esecuzione è altamente parallelizzabile si ha un vantaggio rispetto al solo uso della CPU. Se infatti nel mondo delle CPU troviamo processori fino a 8 core (che, ipotizzando l’uso di un tecnologia simile all’Hyper-Threading, possono eseguire fino a 16 istruzioni per clock), nel mondo delle GPU troviamo schede con fino a 800 “core”, capaci quindi di eseguire in linea di massima altrettante istruzioni per clock.
Le principali limitazioni a mio parere sono due:
-
non tutti gli algoritmi sono facilmente parallelizzabili (anzi in realtà molto pochi), quindi gli scenari d’uso efficienti sono limitati.
-
il linguaggio usato ha forti limitazioni (che riflettono limitazioni dell’architettura) come l’impossibilita di usare funzioni ricorsive o la necessità di dover dividere ogni programma in varie zone di memoria separate tra loro.
Come documentazione quella fornita dalla stessa nvidia sembra ben fatta: http://developer.download.nvidia.com/compute/cuda/2_2/toolkit/docs/CUDA_Getting_Started_2.2_Linux.pdf e http://developer.download.nvidia.com/compute/cuda/2_2/toolkit/docs/NVIDIA_CUDA_Programming_Guide_2.2.pdf
Bisogna tenere a mente però che CUDA è destinato a sparire a vantaggio dello standard OpenCL che permetterà di scrivere codice portabile sia su schede Nvidia che Ati (e di qualsiasi casa che lo implementerà nei propri driver).
EDIT: ok, diventerò il moderatore più lento della storia di FOL 