Découverte de C++ AMP - Part 2

 

 

Le premier billet vous a sensibilisé à la puissance de calcul avec C++ AMP. Je vous propose maintenant de comprendre ce qu’est C++ AMP, en expliquant les motivations qui ont permis à Microsoft de se lancer dans ce projet.

Contexte

Lorsque Microsoft ajoute une nouvelle librairie à Visual Studio, ce n’est pas sans plusieurs motivations parfaitement réfléchies et cette nouvelle librairie, n’échappe pas la règle. Certains lecteurs pourraient être surpris par ce choix, car des technologies comme CUDA et OpenCL disponibles depuis plusieurs années ont rencontré un franc succès auprès des développeurs spécialisés GPU. Pour qu’il n’y ait aucun doute sur les motivations de C++ AMP, je vous propose de passer en revue tous les éléments qui ont poussé Microsoft de se lancer sur un sujet aussi intimiste que la programmation GPU.

Rendre la programmation GPU accessible à tous

La grande majorité des développeurs produit des programmes à destination d’un ou plusieurs CPU, mais finalement elle produit du code ciblant la technologie CPU. Les CPU sont par nature modélisés pour réaliser des traitements génériques sans considération spécifique. Ils sont parfaitement adaptés à la majorité des besoins réclamés par les programmes actuels. Par exemple des applications riches, des applications web et serveurs applicatifs, sont généralement orientés données, mais ne réclament pas des traitements massivement parallèles.

Par nature, les cartes graphiques sont destinées à calculer des informations graphiques pour afficher de très nombreux pixels sur un ou plusieurs écrans. Cependant, certains développeurs graphiques dans les années 2005 ont trouvé astucieux d’utiliser les cartes graphiques plutôt que le CPU pour accélérer des calculs sur des volumes de données très importants. Le calcul sur carte graphique est pertinent lorsque votre problème repose sur un immense volume de données à traiter. Les cartes GPU possèdent des architectures plus simples que les CPU, mais ont surtout un nombre impressionnant de threads que n’ont pas les CPU. Aujourd’hui encore les architectures matérielles des cartes graphiques sont construites pour obtenir des performances d’affichage exceptionnelles. Le succès du calcul sur GPU de ces dernières années a donné lieu à des cartes professionnelles sans sortie vidéo, complètement spécialisées dans la programmation massivement parallèle sur GPU.

Le problème est qu’aujourd’hui, peu de gens possèdent des compétences pour programmer les GPU. Ce type de programmation reste l’affaire de quelques spécialistes que l’on trouve généralement dans les services R&D de nombreuses industries réclamant des calculs très couteux, mais aussi dans le domaine des jeux où on utilise souvent la puissance des GPU. En d’autres mots, les développeurs généralistes ne connaissent pas la programmation GPU, car ils sont rarement face à des traitements couteux, mais surtout parce que la programmation GPU est une technologie de niche compliquée à mettre œuvre. Le développeur généraliste souhaite rarement s’investir dans une technologie intimiste souvent exprimée en langage C, accompagné d’un écosystème relativement pauvre, même si parfois il est face à des cas où des portions de code seraient bien plus performants en programmation le GPU, car il n’existe pas de solution grand public pour programmer les GPU aujourd’hui. Ce dernier point est très important, car c’est la première motivation qui a poussé Microsoft à lancer le projet C++ AMP.

Rendre agnostique votre code C++ AMP aux futures évolutions matérielles

Aujourd’hui les constructeurs de cartes graphiques sont à la croisée des chemins en termes d’architecture matérielle. On assiste à des évolutions importantes entre les GPU et les CPU. C’est un secteur en pleine évolution où la compétition est rude et touche une poignée de constructeurs pour un marché immense. Pour les développeurs C++ AMP, les ingénieurs Microsoft ont pris en compte ce paramètre et affirme que tous les codes C++ AMP ne souffriront pas des futures évolutions matérielles. En réalité, votre code C++ AMP est dès à présent capable de s’exécuter sur de nombreux matériels sans aucune modification. Par nature C++ AMP n’est pas rattaché à un matériel spécifique (pas de code spécifique aux cartes graphiques nVidia, AMD ou même Intel). En d’autres mots votre investissement sera préservé. Ce dernier point est très important, car c’est la seconde motivation qui a poussé Microsoft à lancer le projet C++ AMP.

Vous offrir un large choix de plateforme d’exécution à terme

Votre investissement sur C++ AMP ne se limite pas à une seule plateforme : de Windows Azure à Windows Phone, de Windows Desktop à Windows RT, de Windows Server à Windows Embedded, Windows HPC Server à Xbox, toutes ces plateformes exécuteront à terme votre code C++ AMP. Mais ce n’est pas tout, dans un futur proche, vous pourrez exécuter du code C++ AMP sur des plateformes non Microsoft. En effet, Microsoft a publié en février 2012, une spécification ouverte sur le standard C++ AMP (https://download.microsoft.com/download/4/0/E/40EA02D8-23A7-4BD2-AD3A-0BFFFB640F28/CppAMPLanguageAndProgrammingModel.pdf), permettant aux fabricants de compilateurs d’implémenter C++ AMP sur des plateformes complémentaires à celles de Microsoft. Aujourd’hui, AMD a déjà annoncé qu’il produira une version de C++ AMP au-dessus d’Open CL. L’initiative de Microsoft à travers la spécification ouverte de C++ AMP, a pour but d’encourager tous les fabricants de compilateurs d’implémenter la librairie C++ AMP sur diverses plateformes. Vous l’aurez compris, le champ des possibles de C++ AMP sera à terme immense et vous n’avez pas à vous soucier de la plateforme d’exécution qui exécutera votre code, ce point est très important, car c’est à la fois la troisième et dernière motivation qui a poussé Microsoft à lancer le projet C++ AMP. Arrivé à ce stade, vous avez pris connaissancedes motivations qui ont poussé Microsoft à produire la librairie C++ AMP, il est temps de décrire ce qu’est C++ AMP.

Qu’est que C++ AMP ?

C++ AMP fait partie du compilateur C++. Si vous utilisez déjà le compilateur C++ de Visual Studio 2012, vous avez C++ AMP. Vous n’avez besoin de rien d’autre. Pour déployer votre application C++ AMP, vous n’avez aucun prérequis supplémentaire, le redistribuable Visual C++ contient la librairie C++ AMP. En tant que partie intégrante à Visual Studio, la librairie C++ AMP est parfaitement intégrée à Visual Studio à la fois sur le plan du Debugging, du Profiling et de l’IntelliSense. Avec C++ AMP, vous pouvez réutiliser vos applications et vos connaissances C++, car la librairie a été pensée pour justement les préserver.

On peut définir C++ AMP comme une librairie C++ exposant un petit jeu d’API (compatible STL) sachant gérer des données multidimensionnelles afin de faciliter leur parallélisation. La courbe d’apprentissage de C++ AMP est donc faible, car le jeu d’API est réduit et repose sur le standard C++ 11. Si vous connaissez la librairie STL, alors vous connaissez une bonne partie de C++ AMP.

L’implémentation Microsoft de C++ repose sur l’API Direct3D de DirectX 11. Ce choix d’implémentation est plutôt une bonne chose, car DirectX est une librairie mature et donc stable. Ce choix apporte une abstraction pour supporter de nombreux matériels comme ceux de constructeurs nVidia, AMD, Intel, ARM … Cependant, si votre programme ne détecte pas de matériel compatible DirectX11, C++ AMP se tourne vers une solution de repli, WRAP, que nous avons utilisé dans la première démonstration, exploitant alors les multicœurs disponibles et la vectorisation parallèle via les instructions SSE (AVX n’est pas supporté pour l’instant). Même si Microsoft utilise DirectX pour implémenter C++ AMP, les API DirectX ne sont pas visibles des API C++ AMP. C’est pour cette raison que Microsoft a pu publier une spécification ouverte décrivant le standard C++ AMP sans aucune adhérence avec DirectX.

Pour Microsoft, C++ AMP se doit d’être performant, productif et portable pour tous les développeurs, ce n’est pas un produit de niche. Il n’est pas utile d’être un spécialiste en programmation GPU pour utiliser C++ AMP. Ainsi, un développeur C++ généraliste disposant de Visual C++ 2012, peut parfaitement utiliser cette technologie sans contrainte technique majeure : pas de nouvelles compétences, pas de librairies à ajouter la mise au point ou l’analyse de performance. La mise en production ne réclame rien de plus que le redistribuable C++. Et pour couronner le tout, votre code devrait tourner sur des plateformes complémentaires à celle de Microsoft dans un avenir proche.

Arrivé à ce stade, nous avons beaucoup décrit C++ AMP, sans jamais l’illustrer avec du code, il est temps corriger le tir dans le prochain billet.

 

A bientôt

Bruno

boucard.bruno@free.fr