Découverte de C++ AMP - Part 1

image

Visual Studio 2012 propose une nouvelle librairie appelée C++ Accelerated Massive Parallelism (C++ AMP). Cette librairie permet d'exploiter facilement les nombreux cœurs des cartes GPU (Graphics Processing Unit) afin d'obtenir des performances extrêmes. À l'instar des librairies parallèles fournies avec Visual Studio 2010, la librairie C++ AMP est accompagnée d'un écosystème facilitant le cycle de vie d'une application utilisant du code C++ AMP. Que vous soyez développeur C++ ou bien même C# sans connaissance sur la programmation GPU, cet article vous permettra de comprendre à la fois les concepts inhérents à la programmation sur GPU et leurs implémentations respectives via la librairie C++ AMP. Si au contraire, vous êtes déjà familier avec les technologies comme CUDA ou OpenCL, cet article vous permettra d'apprécier l'expressivité de C++ AMP à la fois simple et efficace.

Introduction

Démonstration d’introduction

Remarque : dans cet article, toutes les démonstrations sont réalisées avec Visual Studio 2012 sous Windows 8 x64, le tout exécuté sur un portable Lenovo W520 contenant un processeur Intel i72820QM cadencé à 2,6 GHz et une carte graphique NVIDIA Quadro M2000.

Si vous êtes complètement novice en programmation parallèle sur GPU, je vous propose une démonstration provenant du premier ouvrage traitant de C++ AMP de Kate Gregory et Ade Miller: https://www.gregcons.com/cppamp/ , dont les codes sources sont téléchargeables : https://ampbook.codeplex.com/releases/view/93158.

La démonstration repose sur une des trois études de cas du livre. Cette démonstration se nomme Cartoonizer. Elle est parfois utilisée par Microsoft pour démontrer C++ AMP. La motivation de cette application est de modifier les couleurs des contours d’une ou plusieurs photos sur le disque ou prises par la Webcam de votre ordinateur en une image similaire à un dessin animé.

Au lancement de l’application, si vous chargez la première image par défaut, vous obtiendrez l’image ci-dessous. L’application regroupe sous plusieurs thèmes des informations relatives au traitement des images. Si vous cliquez sur le bouton « Start », toutes les images du dossier par défaut seront traitées, mais nous n’utiliserons pas ce mode de traitement dans cette démonstration. Nous utiliserons essentiellement les boutons regroupés sous le nom « Single Image », afin de traiter une image à la fois.

image

L’objectif de cette première démonstration est de vous sensibiliser à la puissance GPU, et non d’étudier le code de cette application. Dans la liste « Frame Processor » vous sélectionnez la technologie de parallélisations et dans la liste « Image source » choisissez le mode récupération des images. Vous devez cliquer sur « Load » pour charger la première image par défaut. Pour notre premier test, nous choisissons le mode « Image from folder » et « CPU Single Core » pour la liste « Frame processor ». Puis vous cliquez sur le bouton « Cartoonize ».

image

Vous devriez obtenir un résultat similaire et dans mon cas, ce premier traitement utilisant un seul CPU a pris environ 72 secondes.

Passons au second traitement en choisissant cette fois, « CPU Multi-core » dans la liste « Frame processor ». Puis charger à nouveau la première image et lancer le traitement en appuyant sur « Cartoonize ».

image

Ce traitement repose en interne sur la librairie parallèle C++ PPL disponible depuis Visual Studio 2010.

image

En affichant le « Task Manager », on peut observer la charge CPU au moment du traitement. Le traitement utilisant tous les cœurs du processeur a pris 15 secondes environ; ce qui nous offre une bien meilleure performance, ce qui n’a rien d’étonnant.

Cette fois, vous allez sélectionner dans la liste « Frame processors » l’item « C++ AMP Simple Model : WRAP ». Cet item correspond au mode de repli de C++ AMP dans le cas où votre machine ne contient aucune carte graphique compatible avec son implémentation interne (nous reviendrons sur ce point un peu plus loin).

image

Cette fois, le « Task Manager » affiche un profil CPU bien plus maigre que la version précédente.

image

Noter que le mode WARP est vraiment performant, car il n’a pris que 3 secondes, même s’il n’utilise pas de technique GPU. C’est donc une excellente alternative au traitement GPU, nous en reparlerons.

Cette fois, vous allez sélectionner dans la liste « Frame processors » l’item « C++ AMP Simple Model : Single GPU ». Recharger l’image et lancer le traitement.

image

Le premier traitement utilisant une technologie GPU n’a pris que 351 millisecondes, ce qui est bien plus rapide que tous les autres traitements.

Voici un récapitulatif de tous les résultats de cette première démonstration.

image

Cette première démonstration vous permet de comprendre la puissance du calcul avec C++ AMP. Je vous propose pour le prochain billet de comprendre ce qu’est C++ AMP, en expliquant des motivations qui ont permis à Microsoft de se lancer dans ce projet.

 

A bientôt

Bruno

boucard.bruno@free.fr