DPC++ sur GPUs Nvidia - Guide pratique
Table of Contents
- Introduction
- Prérequis
- Installation de Docker et du toolkit Nvidia
- Exemples de code Sickle pour CUDA
- Exemple 1 : Vecteur ajouté avec Sickle et CUDA
- Exemple 2 : Interopérabilité avec l'API de CUDA
- Exemple 3 : Lancement de noyaux CUDA avec Sickle
- Exercice : Adapter le code CUDA à Sickle
- Conclusion
- FAQ
Introduction
Bonjour à tous et bienvenue dans cet exercice pratique pour DPC++ ! Je m'appelle Stuart Adams et je suis ingénieur logiciel chez Codeplay Software. Dans cet article, je vais vous montrer quelques-uns des travaux auxquels mes collègues et moi avons contribué dans le cadre du projet DPC++. Nous allons vous guider étape par étape à travers des exemples de code Sickle pour CUDA, ainsi qu'un exercice pour adapter du code CUDA à Sickle.
Prérequis
Avant de commencer, il est important de noter que ces exercices ne fonctionnent que sur des machines Linux équipées de cartes graphiques Nvidia. Ils ne fonctionneront pas sur Windows ou le sous-système Windows pour Linux. Si vous souhaitez suivre ces exercices, vous devrez donc utiliser un environnement Linux avec une carte graphique Nvidia installée. De plus, une familiarité avec le langage de programmation C++ sera nécessaire pour comprendre ces exemples et cet exercice.
Installation de Docker et du toolkit Nvidia
Pour travailler sur ces exemples, nous vous recommandons d'installer Docker ainsi que le toolkit Nvidia Container. Cela vous permettra d'exécuter un conteneur contenant toutes les bibliothèques et variables d'environnement nécessaires pour utiliser DPC++. Si vous n'avez pas encore installé Docker ou le toolkit, nous avons inclus un lien vers un guide qui vous aidera à les installer. Cela ne prend que cinq minutes environ. Une fois l'installation terminée, nous pourrons commencer.
Exemples de code Sickle pour CUDA
Dans le répertoire Github de Codeplay Software, vous trouverez une collection d'exemples de code Sickle pour CUDA, ainsi que des instructions sur la façon de les exécuter. Les exemples couvrent différents aspects de l'utilisation de Sickle avec CUDA, allant des bases du vecteur ajouté au lancement de noyaux CUDA avec Sickle.
Exemple 1 : Vecteur ajouté avec Sickle et CUDA
Le premier exemple fournit une implémentation d'un vecteur ajouté de base à la fois avec Sickle et CUDA. En examinant ce code, vous pourrez observer les différences entre les deux APIs. Pour exécuter cet exemple, nous allons créer un nouveau répertoire de construction et exécuter CMake pour générer les fichiers de construction. Ensuite, nous utiliserons Make pour compiler les applications Sickle et CUDA.
Exemple 2 : Interopérabilité avec l'API de CUDA
Le deuxième exemple montre comment interagir avec une API CUDA existante, en utilisant Kublas comme exemple. Ici, nous avons deux programmes qui permettent de comparer l'appel à Kublas depuis CUDA et depuis Sickle. L'application Sickle utilise certaines des nouvelles fonctionnalités d'interopérabilité introduites, telles que la tâche interrupt. Nous allons construire cet exemple de la même manière que le premier exemple, en utilisant CMake et Make.
Exemple 3 : Lancement de noyaux CUDA avec Sickle
Le troisième exemple est similaire au premier, mais cette fois-ci, au lieu d'utiliser des noyaux Sickle, nous utiliserons des noyaux CUDA. Le code reste écrit en Sickle, mais il invoque directement un noyau CUDA via une tâche interrupt. Pour compiler cet exemple, nous n'avons pas besoin de CMake, nous pouvons simplement utiliser Make.
Exercice : Adapter le code CUDA à Sickle
Maintenant que nous avons passé en revue les trois exemples, vous devriez avoir une bonne compréhension des nouvelles fonctionnalités d'interopérabilité entre Sickle et CUDA. L'exercice consiste à adapter un code CUDA existant pour le faire fonctionner avec Sickle. Nous vous fournissons un code CUDA qui effectue une opération similaire à l'exemple 2, mais cette fois en appelant la fonction sgmv au lieu de sgm. Votre tâche consiste à adapter ce code CUDA à Sickle en utilisant les connaissances que vous avez acquises en étudiant les exemples précédents.
Conclusion
Félicitations ! Vous avez maintenant une meilleure compréhension de la programmation DPC++ avec Sickle et CUDA. J'espère que cet exercice vous a permis d'approfondir vos connaissances et de découvrir les possibilités offertes par ces outils. Si vous avez des questions, n'hésitez pas à les poser dans le serveur Discord de Devmash, où nous serons disponibles pour discuter des exercices et des travaux réalisés sur DPC++. Vous pouvez également trouver un enregistrement de cet exercice sur YouTube, ce qui vous permettra de suivre les étapes à votre rythme.
FAQ
Q: Ce code fonctionnera-t-il sur Windows ?
A: Non, ces exercices ne fonctionnent que sur des machines Linux équipées de cartes graphiques Nvidia. Si vous utilisez Windows, vous devrez passer à un environnement Linux pour les exécuter.
Q: Dois-je connaître le langage de programmation C++ pour suivre ces exercices ?
A: Oui, une familiarité avec le langage de programmation C++ est nécessaire pour comprendre ces exemples et cet exercice.
Q: Quelles sont les fonctionnalités d'interopérabilité entre Sickle et CUDA ?
A: Les nouvelles fonctionnalités d'interopérabilité permettent notamment d'appeler des API CUDA existantes depuis Sickle et de lancer des noyaux CUDA directement depuis Sickle.
Q: Où puis-je trouver les exemples de code et les instructions pour les exécuter ?
A: Vous pouvez trouver les exemples de code et les instructions dans le répertoire Github de Codeplay Software dédié aux exemples Sickle pour CUDA.