janvier
2009
Cela faisait plusieurs mois que j’étais attiré par la technologie CUDA et ses possibilités. Je me suis donc lancé pendant les vacances de Noël à faire un raytracer en temps réel (comprendre par là plus de 24 images par seconde) en utilisant CUDA.
CUDA et les ray-tracers
Je m’étais déjà fait les dents sur un mini-raytracer en Java en suivant l’excellentissime tutoriel de LeGreg et j’étais arrivé aux performances de 700ms sur un simple rendu de 3 sphères avec une lumière en gérant les réflexions. Et comme d’habitude, une fois le principe compris, je ne le finis pas et décida de passer à autre chose.
Mais, quelques mois plus tard, en lisant sur le forum ompf (soi-dit en passant : une des meilleurs sources d’informations pour le lancer de rayon en général) que certaines personnes avaient réussi à faire des raytracers en temps réel en CUDA. Là, la mouche me pique et je décide moi aussi d’en faire un.
J’ai donc commencé à me renseigner sur CUDA et 3 jours après j’avais mes 3 boules sur l’écran avec un rendu à 40 fps. Voici le résultat :
J’étais donc satisfait : sans vraiment trop essayer d’optimiser, j’obtenais des performances bien meilleures que si je les avais faites sur un simple CPU (en sachant qu’on peut faire beaucoup mieux). De plus, j’ai été agréablement surpris par la transparence de CUDA et sa prise en main rapide.
CUDA et le C++ (oui, oui… vous avez bien lu)
Mais je ne me suis pas arrêté là, j’ai décidé de pousser le compilateur nvcc jusqu’à ses derniers retranchements après avoir découvert la bibliothèque stdcuda qui utilise CUDA avec du langage C++ et des templates ! En effet, officiellement, CUDA supporte le langage C avec quelques extensions dans les fonctions qui seront exécutées dans la carte graphique.
Que Nenni ! CUDA supporte en fait presque tout le C++ mis à part le polymorphisme (en effet, à cause de l’architecture GPU, c’est très difficile de faire du polymorphisme). Vous pouvez donc utiliser presque toute la puissance du C++ notamment la surcharge des opérateurs (j’aime mes classes Real3 et Matrix4 dans mon code CUDA…) ce qui permet de simplifier énormément votre code et de le factoriser au maximum sans rien perdre en performance. Néanmoins, CUDA étant jeune, j’ai réussi à faire planter le compilateur sur certains bouts de code et il faut avouer que parfois les messages d’erreurs qu’il nous renvoie sont carrément inutiles ou nous font chercher au mauvais endroit, ce qui est encore pire.
CUDA et la non-édition de liens (oui, oui… là aussi vous avez bien lu :D)
Dernier soucis et pas des moindres, CUDA ne supporte pas l’édition de liens à la compilation. Vous ne pourrez donc pas séparer votre code en plusieurs fichiers .cu (vous pouvez par contre avoir autant de fichiers de déclarations que vous voulez) ou alors vous devrez vous assurer de tous les inclure dans un seul fichier (workaround dégueulasse, mais workaround qui fonctionne)… C’est bien dommage mais je pense que dans les prochaines versions cette limitation sera corrigée, il n’y a pas de raison.
En résumé : essayez CUDA ! Ce ne sera pas une perte de temps !
Récupération du code source
Vous pouvez récupérer le code source ici. Ou essayez une de ces commandes :
git clone http://git.gitorious.org/personal-julian-ibarz/mainline.git
Il y a également un viewer de source par navigateur web sur le site web.