Programmation des GPU en C++
La montée en puissance des GPUs s’est accompagnée du développement de langages de programmation spécifiques comme Cg ou GLSL pour tirer parti de leurs performances. La syntaxe de ces langages est proche du C, mais ils sont clairement destinés à la programmation d’applications graphiques, et demandent une bonne connaissance du fonctionnement interne des GPU.
Pour exécuter des programmes plus généraux sur les GPUs, l’idéal serait de disposer de compilateurs capables de générer « tout seuls » du code optimisé pour les GPU à partir d’un source C++ standard. On n’y est pas encore, mais ça progresse.
Actuellement, il existe des librairies permettant d’utiliser le GPU comme coprocesseur au travers d’un API comme:
Dans sa thèse de doctorat « GPU++ – An Embedded GPU Development System for General-Purpose Computations » Thomas Jansen a franchi une étape de plus en permettant de développer des shaders directement en C++ à l’aide d’une librairie qui génère du code GPU (je n’ai pas encore compris comment) à la compilation sur un compilateur standard.
RapidMind propose une « plateforme » basée sur une idée similaire, mais en la généralisant encore. Leur système permet d’optimiser le même code sur des processeurs aussi différents que les GPU multi-coeurs, les GPU et le processeur Cell qui équipe les PlayStation 3. Mais comme on le voit ci-dessous, le langage C++ est difficilement reconnaissable derrière l’utilisation d’un API et de macros:

Cette approche est cependant très générale et efficace, comme on le voit sur la page des « Case Studies« , qui inclut au moins deux domaines qui m’intéressent:
- La simulation des fluides
- Les fractales. J’y reviens dans un prochain article
Documents intéressants:
- Mike Houston « General Purpose Computation on Graphics Processors (GPGPU) », 2005, ATI X1000 Series Launch, Ibiza, Spain
Votre commentaire