Introduction à la programmation GPU - Part 2

Installer CUDA C avec Visual Studio 2010

clip_image002[1]

Dans la première partie de cette série d’articles consacrés à l’introduction à la programmation GPU (Graphics Processing Unit), nous avons présenté les différentes technologies et l’algorithme qui sera utilisé pour chaque technologie. Nous avons constaté les performances de cet algorithme, à la fois en mode séquentiel et en mode parallèle sur un CPU (Central Processing Unit) de type quad-cœurs.

Dans cette seconde partie, nous allons nous concentrer sur l’installation du Framework nVIDIA CUDA (Compute Device Unified Architecture) et de son intégration avec Visual Studio 2010.

Vérification de votre carte graphique

Par nature, la programmation nVIDIA CUDA exige une carte graphique nVIDIA compatible CUDA. Vous trouverez à l’adresse suivante, l’ensemble des cartes nVIDIA compatibles CUDA: https://developer.nvidia.com/cuda-gpus

clip_image004[1]

Les cartes sont classées par catégorie de produits. L’offre est extrêmement diverse puisque les cartes GPU couvrent un territoire allant de machines type « data-center » jusqu’aux PC portables. La colonne « Compute Capability » indique la version de l’architecture matérielle CUDA relative à la carte associée. La version 2.0 est actuellement la dernière version, cependant vis-à-vis de notre étude qui est orientée découverte de la programmation GPU, la version de l’architecture n’a pas d’importance. Si vous ne possédez pas une carte nVIDIA compatible CUDA, vous ne pourrez malheureusement pas exécuter du code CUDA (le mode émulation de la carte graphique n’est plus supporté en CUDA C 4.0). Si au contraire vous avez une carte compatible CUDA, vous pouvez passer au téléchargement des produits.

Télécharger les produits

Si votre machine s’exécute sur Windows 7, Windows Vista ou Windows XP, vous trouverez tous les éléments à télécharger à cette adresse : https://developer.nvidia.com/cuda-toolkit-40#windows

clip_image006[1]

Il est préférable d’installer les différents packages dans l’ordre présenté sur la page Web. J’ai donc repris les cinq étapes correspondantes à une installation complète, comprenant le driver, le Toolkit de développement, le SDK complémentaire et l’outillage de mise au point.

• La première étape consiste à installer le driver à la fois adapté à votre carte vidéo et à votre système d’exploitation (32bit ou 64bit). Les nouvelles machines équipées d’une carte nVIDIA disposent déjà d’un driver nVIDIA à jour, mais si vous aviez un doute, vous pouvez toujours vérifier et le cas échéant installer la dernière version si votre version n’est pas à jour.

• L’étape essentielle repose sur le CUDA Toolkit. En effet, ce package comprend tous les éléments pour développer : compilateur, profileur et un ensemble de librairies complémentaires.

clip_image008[1]

Figure 2.1: installation du NVIDIA CUDA Toolkit v4.0

• Je vous invite à télécharger aussi la documentation respective aux différents packages que vous souhaitez installer.

• Malheureusement pour les développeurs Visual Studio 2010, le package CUDA Toolkit présente un petit problème au niveau du fichier MSBUILD permettant la compilation et l’édition de lien CUDA C dans Visual Studio. Il faut donc télécharger aussi le package « *NEW* CUDA Toolkit 4.0 Build Customization BUG FIX Update Fixes error message « $CUDABuildTasksPath) property is not valide » , afin d’obtenir une compilation CUDA C opérationnelle.

clip_image010[1]

Figure 2.2: distribution du package *NEW* CUDA Toolkit 4.0 Build Customization BUG FIX

 

Après avoir téléchargé ce ZIP dans un répertoire temporaire, vous trouverez le fichier « README_CUDA4-0-BuildCustomization.txt » qui vous fournira les instructions d’installation. Mais en deux mots vous devrez copier le fichier “CUDA 4.0.targets” et “CUDA 4.0.props” en fonction de votre système d’exploitation :

32bit OS: C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations

64 bit OS: C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations

• Vous pouvez aussi installer le GPU Computing SDK qui arrive avec des librairies complémentaires et de nombreux exemples déclinés dans diverses technologies : CUDA C, Microsoft Direct Compute et OpenCL.

clip_image012[1]

Figure 2.3: Installation du package NVIDIA GPU Computing SDK 4.0

Certaines démos sont très impressionnantes et elles ont le mérite d’être livrées avec leurs sources.

clip_image014[1]

Figure 2.4: L’application nBody en action

Par exemple l’application N-Body implémentée via Direct Compute. Vous trouverez cet exemple pour une version 64 bit : C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\DirectCompute\bin\win64\Release\nBodyCS.exe

• Si vous souhaitez diagnostiquer votre code CUDA, je vous invite à installer Parallel Nsight 2.0. Malheureusement, ce package est un peu contraignant, puisqu’il vous réclame une exécution sans le thème Aero et sans l’accélération matérielle WPF (des fichiers de type « .reg » sont fournis avec l’installation pour modifier la base de registre afin de désactiver ou d’activer l’accélération matérielle). Cependant, ce package est vraiment très important lorsque vous développez avec CUDA C sous Windows.

clip_image016[1]

Figure 2.5: Installation du package NVIDIA Parallel Nsight 2.0

Configuration de CUDA C dans Visual Studio 2010

Activer la reconnaissance des fichiers CUDA type « .cu »

                Par défaut, Visual Studio ne reconnait pas les fichiers CUDA dont l’extension est « .cu ». Vous devez donc personnaliser Visual Studio :

• Dans Visual Studio 2010, choisissez le menu « Tools-> Options... »

clip_image018[1]

• Ouvrez la section « Text Editor » et cliquez dans l’arborescence le nœud "File Extension". Tapez cu dans la zone texte « Extension » en choisissant au préalable « Editor » « Microsoft Visual C++ », puis validez avec le bouton « Apply » afin d’enregistrer la modification. Ensuite, frappez « Ok » pour sortir.

clip_image020[1]

Figure 2.6: Activer la reconnaissance des fichiers CUDA dans Visual C++

Ajouter la coloration syntaxique des extensions CUDA C

                Lorsque vous développerez vos applications avec CUDA C, vous serez sans doute plus confortable si votre éditeur de code reconnait les extensions CUDA C, ceci vous permettant de lire plus facilement le code CUDA C. Pour installer cette coloration syntaxique, il vous faut aller dans le répertoire : C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\doc\syntax_highlighting. Vous y trouverez deux répertoires correspondant respectivement aux versions de Visual Studio 2005 et de Visual Studio 2008.

clip_image022[1]

Figure 2.7: Packages pour activer la coloration syntaxique CUDA

 

Pour une installation avec Visual Studio 2010, vous pouvez choisir la version de Visual Studio 2008.

• Sur un système 64 bit vous devez vous rendre dans le répertoire "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE" (répertoire "C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE" sur un système 32 bit), vous devriez trouver le fichier usertype.dat. Si ce fichier n’existe pas vous pouvez directement copier le fichier du package CUDA. Si le fichier est déjà présent vous pouvez éditer son contenu, puis copier ce contenu du fichier usertype.dat de la distribution CUDA à la fin du fichier "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE \usertype.dat" déjà présent.

• Les mots clefs CUDA C apparaitrons dans la couleur bleue.

Vérifier l’installation du Runtime CUDA

Vous pouvez lancer le nVIDIA GPU Computing SDK 4.0, dont une icône devrait être sur votre bureau (si vous n’avez pas décoché la case à l’installation). Vous devriez obtenir un écran similaire à l’image ci-dessous.

clip_image024[1]

Figure 2.8: Application NVIDIA GPU Computing SDK Browser

L’application est organisée en onglets thématiques : CUDA C Code Samples, CUDA Libraries Samples, OpenCL Samples, Documentation. Pour vérifier si votre installation est correcte et obtenir des informations sur la configuration de votre architecture CUDA. En tant que programmeur parallèle sur CPU, le nombre de cœurs disponibles vis-à-vis de votre calcul est un élément important. En effet, la rapidité de traitement dépend naturellement du nombre de threads engagé dans votre traitement. En programmation parallèle sur GPU, le nombre de threads disponibles est tout aussi important, si ce n’est plus. Si vous ne connaissez pas la capacité de votre carte graphique, vous pouvez lancer l’exécutable deviceQuery.exe, fournit dans la distribution du SDK en x64: C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.0\C\bin\win64\Release\deviceQuery.exe

clip_image026[1]

Figure 2.9: Exécution du programme deviceQuery

Les informations retournées deviceQuery.exe nous sont très précieuses, car elles nous indiquent les capacités physiques de notre carte graphique vis-à-vis de notre prochaine programmation en CUDA C. Nous y reviendrons un peu plus loin, lorsque nous détaillerons l’architecture CUDA.

Si vous n’avez pas rencontré de problème jusqu’à présent, vous pouvez passer à l’étape suivante : vérifier l’intégration de CUDA C au sein de Visual Studio.

Création de notre premier programme CUDA C au sein de Visual Studio 2010

Cette étape va vous demander un petit effort de codage. Dans Visual Studio 2010, vous devez lancer l’assistant Visual C++ et choisir le patron Win32 puis sélectionner le type « Win32 Console Application » .

clip_image028[1]

Figure 2.10: Création d’un projet type console avec Visual C++

Valider les options par défaut et vous devriez obtenir un code C++ généré similaire.

// MyFirstCudaApp.cpp : Defines the entry point for the console application.

//

 

#include "stdafx.h"

 

 

int _tmain(int argc, _TCHAR* argv[])

{

         return 0;

}

Figure 2.11: Code généré par l’assistant

A ce stade, vous pouvez renommer le fichier MyFirstCudaApp.cpp en MyFirstCudaApp.cu

clip_image030[1]

Figure 2.12: Solution de notre premier projet CUDA

Pour que le compilateur C/C++ puisse trouver les fichiers headers de la distribution CUDA, vous devez paramétrer le chemin correspondant. Vous devez aller dans le menu projet, sélectionner les propriétés du projet. Dans le nœud « Configuration Properties » , sélectionnez la ligne « VC++ Directories » .

clip_image032[1]

Figure 2.13: Ajouter la variable $(CUDA_INC_PATH) à la des chemins d’inclusion

Cette variable a été déclarée durant la phase d’installation. Vous pouvez vérifier que les fichiers
d'entête sont bien accessibles depuis Visual Studio en ajoutant le fichier cuda.h.

clip_image034[1]

Figure 2.13: Vérifier que les fichiers CUDA sont accessibles

Vous pouvez alors activer la compilation CUDA C. Vous devez afficher la boite de dialogue Visual C++ Build Customization Files. Vous pouvez par exemple faire un clic droit sur le projet de la fenêtre « Solution Explorer » et sélectionner le menu « Build Customizations … » .

clip_image036[1]

Figure 2.14: Activer l’utilisation de l’extension CUDA 4.0 pour la compilation du projet

Vous devez cocher la ligne CUDA 4.0. Une fois activée la compilation CUDA, vous devez sélectionner le fichier MyFistCudaApp.cu et afficher les propriétés du fichier.

clip_image038[1]

Figure 2.15:Configurer votre type de fichier en CUDA C/C++

Puis, vous devez choisir au niveau de la ligne « Item Type : CUDA C/C++ » .

Enfin, au niveau du projet, vous pouvez saisir le chemin où se trouve le CUDA Toolkit via la variable $(CUDA_PATH)

clip_image040[1] 

Figure 2.16: Indiquer où se trouve le CUDA Toolkit

Pour terminer le paramétrage CUDA C, il ne vous reste plus qu’à ajouter la librairie CUDA, cudart.lib, dans la partie édition de lien au niveau de la ligne « Additional Dependencies ».

clip_image042[1] 

Figure 2.17: Indiquer la librairie cudart.lib dans la liste des librairies à inclure dans l’édition de lien.

Pour vérifier que notre intégration dans Visual Studio fonctionne bien, je vous propose d’interroger votre carte graphique sur ses capacités de traitements. Nous allons donc reproduire partiellement le programme présenté précédemment, deviceQuery.exe. Pour réaliser cette petite vérification nous allons directement inclure dans le fichier principal de notre projet, les deux fichiers cuda.h (fichier essentiel pour le développement CUDA) et cuda_runtime_api.h qui contient la déclaration de la fonction cudaGetDeviceProperties dont la motivation est de retourner une structure cudaDeviceProp contenant les caractéristiques de votre carte.

// MyFirstCudaApp.cu : Defines the entry point for the console application.

//

 

#include "stdafx.h"

#include <cuda.h>

#include <cuda_runtime_api.h>

 

int _tmain(int argc, _TCHAR* argv[])

{

   cudaDeviceProp prop;

 

   cudaGetDeviceProperties( &prop, 0);

   printf( "Information for device %s\n\n", prop.name);

   printf( "Maximum number of threads per block: %d\n",

                prop.maxThreadsPerBlock );

   printf( "Maximum size of each dimension of a block: (%d, %d, %d)\n",

                prop.maxThreadsDim[0], prop.maxThreadsDim[1],

                prop.maxThreadsDim[2] );

   printf( "Maximum size of each dimension of a grid: (%d, %d, %d)\n",

                prop.maxGridSize[0], prop.maxGridSize[1],

                prop.maxGridSize[2] );

   printf( "\n" );

   return 0;

}

Figure 2.18: Listing pour interroger votre code graphique

Vous pouvez passer à la compilation où vous observerez une compilation hybride entre le compilateur Microsoft C/C++ et le compilateur CUDA C (ncvcc.exe).

clip_image044[1]

Figure 2.19: Compilation C/C++ avec le compilateur CUDA

Si la compilation est un succès, il ne vous reste plus qu’à vérifier l’exécution de notre premier programme CUDA.

clip_image046[1]

Figure 2.20: Exécution de notre premier programme CUDA

Le programme affiche les trois propriétés de ma carte graphique réclamées par notre programme. On note que les valeurs sont en adéquation avec le programme deviceQuery.exe. Arrivé à ce stade, vous disposez d’un environnement de développement d’applications CUDA opérationnel.

En conclusion

                L’installation du Framework CUDA C 4.0 avec Visual Studio 2010 exige un peu d’attention. Si vous souhaitez créer de nombreux projets CUDA, vous pouvez utiliser un fichier Property Sheets (C++) afin de ne pas ressaisir tout le paramétrage du projet à chaque fois: https://msdn.microsoft.com/en-us/library/a4xbdz1e.aspx. Après avoir configuré CUDA C dans l’environnement Microsoft, vous devriez retrouver un confort assez similaire à un projet C/C++ standard. Enfin, nous avons mis l’accent sur des informations clefs de l’architecture CUDA, comme le nombre de threads par bloc ou la dimension des blocs sans pour autant expliquer pourquoi ces valeurs étaient si importantes.

Dans la prochaine partie, nous détaillerons l’organisation des threads CUDA, puis nous montrerons comment dimensionner vos calculs en CUDA C afin d’obtenir des traitements rapides et justes. Enfin, nous implémenterons l’algorithme présenté dans la première partie, puis nous constaterons l’expressivité du code et les performances obtenues.

A bientôt,

Bruno

boucard.bruno@free.fr