Microsoft publie la spécification C++ AMP dédiée aux calculs parallèles

Un premier vrai mariage des CPU et GPU ? 18
Vincent Hermann
En termes de développement, il est délicat aujourd’hui de faire le lien entre les calculs distribués au processeur central (CPU) et aux unités de calculs graphiques (GPU). Il existe des langages particuliers pour ces derniers, afin d’en exploiter la puissance, mais le mélange est parfois délicat à réaliser. Microsoft a donc décidé de proposer une nouvelle spécification baptisée C++ AMP (Accelerated Massive Parallelism) afin de mixer plus facilement CPU et GPU.

c++ amp

Une question d’aiguillage

C++ AMP est une spécification qui avait été dévoilée pour la première fois en juin de l’année dernière. Microsoft présentait alors son objectif : permettre aux développeurs de rédiger du code proche du C++ qui pourrait beaucoup plus facilement tirer parti du très fort parallélisme que l’on peut trouver sur les machines. Car si les processeurs disposent souvent maintenant de deux, quatre ou six unités de calculs physiques, les GPU peuvent en posséder des dizaines.

Jusqu’à présent, tirer partie de cette puissance pour autre chose qu’un jeu vidéo pouvait se révéler délicat. Le code doit intégrer des tronçons rédigés dans un autre langage ou revêtant une forme particulière. C’est le cas d’OpenCL par exemple, qui a justement la mission d’ouvrir la porte des GPU. La spécification AMP permet, elle, de tout rédiger en C++. En outre, l’envoi des instructions au CPU ou au GPU peut se faire automatiquement.

Il s’agit d’une sorte d’aiguillage automatique, ce qui semble être à la fois une force et une faiblesse. L’avantage est en effet que cela rend l’ensemble plus simple à utiliser. Le défaut réside dans l’automatisme : il peut faire « bien » les choses la plupart du temps et ne pas adopter le bon comportement dans des cas particuliers. Le développeur pourra donc utiliser la fonction Restrict() pour obliger son code à être exécuté soit par le CPU, soit par le GPU.

L’ouverture de la spécification et l’accès au GPU

La spécification C++ AMP a été publiée sous Open Specification Promise, une forme de licence particulière de l’éditeur autorisant un tiers à utiliser le produit comme bon lui semble ou presque, sans que la firme ne vienne demander des comptes par la suite. L’implémentation chez Microsoft sera faite dans Visual Studio 11 dont la bêta devrait logiquement être publiée en même temps, ou peu après celle de Windows 8. Les caractéristiques AMP seront donc « prêtes à l’emploi ».

Dans le cas d’une utilisation classique dans Visual Studio, c’est DirectCompute qui sera utilisé pour générer un bytecode qui, à son tour, sera interprété par le GPU. Ce qui sous-entend l’utilisation de Direct3D. Au niveau d’un code C++ sans précision, le compilateur choisira ce qui semble le mieux adapté. Si le développeur souhaite garder la main, il pourra préciser d’un « Restrict (Direct3D) » qu’il veut que des calculs précis soient envoyés au GPU.

La spécification AMP a été développée en partenariat avec NVIDIA et AMD. L’exploitation des cartes graphiques dans des applications plus « classiques » est une étape importante, mais la question qui se pose est de savoir si elle peut se faire avec autre chose que Direct3D / DirectCompute. Théoriquement, la réponse est oui, et il est possible d’implémenter la spécification dans GCC par exemple, en s’appuyant sur le couple OpenGL / OpenCL.

Pourquoi faire ?

Il s’agit de donner un premier élément de réponse maison à la problématique du développement hétérogène. Une grande partie de la puissance disponible reste le plus souvent inexploitée. Un C++ permettant d’utiliser cette dernière est donc une étape importante. Bien entendu, il existe de nombreux cas ou l’AMP ne sera d’aucun secours. Une application comme Word par exemple n’a que faire de telles capacités. À l’inverse, un logiciel de rendu 3D ou de calculs physiques aurait un grand intérêt à l’utiliser si le développeur ne souhaite pas se plonger dans un autre langage tel qu’OpenCL, plus bas niveau, ou C pour CUDA, limité aux cartes NVIDIA.

Ce C++ pourrait avoir un avenir assez radieux dans le petit monde de Microsoft. On imagine bien que l’éditeur va l’utiliser pour ses propres applications dans le futur. En outre, l’utilisation de ce langage dans le cas de l’environnement WinRT de Windows 8 pourrait générer un code tirant automatiquement parti d’un GPU ou d’une puce spécialisée.

Actuellement, ceux qui veulent en savoir davantage pourront consulter le blog du MVP David Moth dédié au développement parallèle. Il a d’ailleurs proposé récemment une liste d’exemples de projets exploitant C++ AMP.