Introduction à la programmation des GPUs



Documents pareils
. Plan du cours. . Architecture: Fermi ( ), Kepler (12-?)

Introduction à CUDA.

Introduction au calcul parallèle avec OpenCL

Architecture des ordinateurs

Initiation au HPC - Généralités

Calcul multi GPU et optimisation combinatoire

Segmentation d'images à l'aide d'agents sociaux : applications GPU

Rapport 2014 et demande pour Portage de Méso-NH sur Machines Massivement Parallèles du GENCI Projet 2015 : GENCI GEN1605 & CALMIP-P0121

Contrôle Non Destructif : Implantation d'algorithmes sur GPU et multi-coeurs. Gilles Rougeron CEA/LIST Département Imagerie Simulation et Contrôle

Eléments d architecture des machines parallèles et distribuées

Une bibliothèque de templates pour CUDA

Quantification d incertitude et Tendances en HPC

Architecture des calculateurs

Journée Utiliateurs Nouvelles du Pôle ID (Informatique) Pierre Neyron, LIG/CNRS

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Tests de performance du matériel

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Hiérarchie matériel dans le monde informatique. Architecture d ordinateur : introduction. Hiérarchie matériel dans le monde informatique

Master première année. Mention : Statistiques et Traitement de Données «STD» Rapport de stage

Génération de code binaire pour application multimedia : une approche au vol

Introduction à la Programmation Parallèle: MPI

I00 Éléments d architecture

Exécution des instructions machine

Séminaire RGE REIMS 17 février 2011

Retour d expérience, portage de code Promes dans le cadre de l appel à projets CAPS-GENCI

Les mésocentres HPC àportée de clic des utilisateurs industriels

as Architecture des Systèmes d Information

T. Gasc 1,2,3, F. De Vuyst 1, R. Motte 3, M. Peybernes 4, R. Poncet 5

Règles et paramètres d'exploitation de Caparmor 2 au 11/12/2009. Pôle de Calcul Intensif pour la mer, 11 Decembre 2009

Infrastructures Parallèles de Calcul

Concept de machine virtuelle

Une dérivation du paradigme de réécriture de multiensembles pour l'architecture de processeur graphique GPU

Maarch Framework 3 - Maarch. Tests de charge. Professional Services. 11, bd du Sud Est Nanterre

Infrastructure de calcul du CRRI

Mesure de performances. [Architecture des ordinateurs, Hennessy & Patterson, 1996]

THEME 1 : L ORDINATEUR ET SON ENVIRONNEMENT. Objectifs

Architecture des Ordinateurs. Partie II:

Les environnements de calcul distribué

Vulgarisation Java EE Java EE, c est quoi?

CH.3 SYSTÈMES D'EXPLOITATION

Introduction au langage C

Mobile OGSI.NET: Grid Computing on Mobile Devices

Info0804. Cours 6. Optimisation combinatoire : Applications et compléments

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Systèmes et traitement parallèles

Potentiels de la technologie FPGA dans la conception des systèmes. Avantages des FPGAs pour la conception de systèmes optimisés

La technologie Java Card TM

Rapport d activité. Mathieu Souchaud Juin 2007

Diagrammes de Package, de déploiement et de composants UML

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Chapitre 1. Infrastructures distribuées : cluster, grilles et cloud. Grid and Cloud Computing

Programmer en JAVA. par Tama

LA RECONNAISSANCE VOCALE INTEGREE

Programmation parallèle et ordonnancement de tâches par vol de travail. Thierry Gautier MOAIS, INRIA, Grenoble

Cours 7 : Programmation d une chaîne d acquisition

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

MODULE I1. Plan. Introduction. Introduction. Historique. Historique avant R&T 1ère année. Sylvain MERCHEZ

Programmation C. Apprendre à développer des programmes simples dans le langage C

Caractéristiques principales:

Outil d aide au choix Serveurs Lot 4 Marché Groupement de Recherche

CAHIER DES CHARGES D IMPLANTATION

Rappels d architecture

Protection de l Investissement Virtualisation, Efficacité énergétique

FICHE PRODUIT 360 SPEECHMAGIC SDK

Initiation. àl algorithmique et à la programmation. en C

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

TP1 : Initiation à Java et Eclipse

3 ème journée des utilisateurs de l archivage

Contribution à la conception à base de composants logiciels d applications scientifiques parallèles.

High Performance by Exploiting Information Locality through Reverse Computing. Mouad Bahi

Introduction à l architecture des ordinateurs. Adrien Lebre Décembre 2007

La carte à puce. Jean-Philippe Babau

L'écosystème du calcul intensif et des données : la vision du CNRS. M. Daydé. Directeur du Comité d Orientation pour le Calcul Intensif au CNRS

<Insert Picture Here> Solaris pour la base de donnés Oracle

IRL : Simulation distribuée pour les systèmes embarqués

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Intel Corporation Nicolas Biguet Business Development Manager Intel France

Choix d'un serveur. Choix 1 : HP ProLiant DL380 G7 Base - Xeon E GHz

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Plan global Outils de développement et compilation. Plan. Objectifs des outils présentés. IDE, GCC/Clang, ASAN, perf, valgrind, GDB.

Gestion de clusters de calcul avec Rocks

Initiation à JAVA et à la programmation objet.

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Le supercalculateur Tera 100 Premier supercalculateur pétaflopique européen

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Une méthode de conception de systèmes sur puce


victor Logiciel de gestion pour une sécurité unifiée

1 Architecture du cœur ARM Cortex M3. Le cœur ARM Cortex M3 sera présenté en classe à partir des éléments suivants :

WINDEV MOBILE. ios SMARTPHONE SUPPORT: IOS, ANDROID, WINDOWS PHONE 8.

Traitement de données

StruxureWare Power Monitoring v7.0. La nouvelle génération en matière de logiciel de gestion complète d énergie

LA MISSION D'AMD 2 L'HISTOIRE D'AMD 2014

UE Programmation Impérative Licence 2ème Année

Chapitre 5 : Les procédures stockées PL/SQL

Sanity Check. bgcolor mgcolor fgcolor

Transcription:

Introduction à la programmation des GPUs Anne-Sophie Mouronval Mesocentre de calcul de l Ecole Centrale Paris Laboratoire MSSMat Avril 2013 Anne-Sophie Mouronval Introduction à la programmation des GPUs 1

Plan Introduction 1 Introduction GPU Intérêts pour le HPC 2 Streaming Multiprocessor Mémoires 3 Anne-Sophie Mouronval Introduction à la programmation des GPUs 2

Plan Introduction GPU Intérêts pour le HPC 1 Introduction GPU Intérêts pour le HPC 2 Streaming Multiprocessor Mémoires 3 Anne-Sophie Mouronval Introduction à la programmation des GPUs 3

GPU : Graphics Processing Unit GPU Intérêts pour le HPC Processeur massivement parallèle, disposant de sa propre mémoire assurant les fonctions de calcul de l affichage. Puce NVIDIA Kepler 20 Carte Tesla K20 Anne-Sophie Mouronval Introduction à la programmation des GPUs 4

CPU vs GPU Introduction GPU Intérêts pour le HPC CPU : optimisé pour exécuter rapidement une série de tâches de tout type. GPU : optimisé pour exécuter des opérations simples sur de très gros volumes de données. beaucoup plus de transistors dédiés au calcul sur les GPUs et moins aux unités de contrôle. Anne-Sophie Mouronval Introduction à la programmation des GPUs 5

Plan Introduction GPU Intérêts pour le HPC 1 Introduction GPU Intérêts pour le HPC 2 Streaming Multiprocessor Mémoires 3 Anne-Sophie Mouronval Introduction à la programmation des GPUs 6

GPU Intérêts pour le HPC Pourquoi utiliser des GPUs pour le HPC? Anne-Sophie Mouronval Introduction à la programmation des GPUs 7

GPU Intérêts pour le HPC Pourquoi utiliser des GPUs pour le HPC? A performance égale, les GPUs sont, par rapport aux CPUs : des solutions plus denses (9 moins de place) ; moins consommateurs d électricité (7 moins) ; moins chers (6 moins). Chiffres issus de "High Performance Computing : are GPU going to take over?", A. Nedelcoux, Université du SI, 2011. Ces chiffres ont été obtenus sur une application réelle et varient d une application à l autre. Anne-Sophie Mouronval Introduction à la programmation des GPUs 8

Cartes graphiques Introduction GPU Intérêts pour le HPC Cartes NVIDIA. Chaque architecture (Tesla, Fermi, Kepler, Maxwell...) est déclinée en 3 familles : GeForce (graphisme grand public) ; Quadro (visualisation professionnelle) ; Tesla (orientée ). Cartes AMD (ATI). Radeon ;... Anne-Sophie Mouronval Introduction à la programmation des GPUs 9

GPU Intérêts pour le HPC Top500 (11/2012), supercalculateur #1 R peak = 27.1 PFlops. R max = 17.5 PFlops (Linpack). 560640 cœurs. 18688 Procs. AMD Opteron de 16 cœurs à 2.2 GHz ; Titan (Cray XK7, USA) 18688 GPUs Nvidia K20x de 14 SMx à 732 MHz. 710 TiB de ram, 10 PiB de disque. TOP500 supercomputer sites : http ://www.top500.org/ 8.2 MW. Anne-Sophie Mouronval Introduction à la programmation des GPUs 10

Plan Introduction Streaming Multiprocessor Mémoires 1 Introduction GPU Intérêts pour le HPC 2 Streaming Multiprocessor Mémoires 3 Anne-Sophie Mouronval Introduction à la programmation des GPUs 11

(NVIDIA) Streaming Multiprocessor Mémoires Jusqu à 16 Streaming Multiprocessors (SM) de 32 cœurs CUDA soit 512 cœurs. SM Anne-Sophie Mouronval Introduction à la programmation des GPUs 12

SM Streaming Multiprocessor Streaming Multiprocessor Mémoires Regroupe 32 cœurs ayant des unités de calcul 64 bits. Ordonnance les threads par paquets (via le Warp Scheduler). Dispose de registres, de mémoire partagée et de caches. Anne-Sophie Mouronval Introduction à la programmation des GPUs 13

Plan Introduction Streaming Multiprocessor Mémoires 1 Introduction GPU Intérêts pour le HPC 2 Streaming Multiprocessor Mémoires 3 Anne-Sophie Mouronval Introduction à la programmation des GPUs 14

Hiérarchie mémoire Introduction Streaming Multiprocessor Mémoires Mémoires sur la puce : registres, très rapides (RW), 32 bits (32768 par SM) ; mémoire partagée (RW), jusqu à 48 KiB par SM. Mémoires hors de la puce : mémoire globale (RW), quelques GiB, lente (quelques centaines de cycles d horloge) ; mémoire de texture (RO) ; mémoire de constantes (RO) : accès rapide ; mémoire locale (RW). Anne-Sophie Mouronval Introduction à la programmation des GPUs 15

Streaming Multiprocessor Mémoires Transferts entre mémoires CPU-GPU Le GPU a sa propre mémoire (mémoire globale). Bande passante (BP) de l ordre de 100 GiB/s. Exemple : carte Tesla 2050 avec RAM à 1500 MHz, BP = 144 GiB/s. En comparaison, la bande passe mémoire pour un CPU est de l ordre de 10 GiB/s. Exemple : proc. Nehalem avec RAM à 1066 MHz, BP = 25.6 GiB/s. Le GPU n accède pas à la mémoire centrale du CPU. Les transferts entre la mémoire du CPU et celle du GPU se font via le bus Pci-express. BP de l ordre de 10 GiB/s et grande latence pénalisant! Exemple : Pci-express x16, Gen2, BP = 8 GiB/s. Anne-Sophie Mouronval Introduction à la programmation des GPUs 16

Qu est-ce que le? : General-Purpose computing on Graphics Processing Units 3 approches pour utiliser le GPU pour faire du HPC. Bibliothèques (cublas, MAGMA, Thrust...) Langages "Legacy " (avant CUDA, vers 2004) CUDA (2007) (2008) Directives (2007) (2011) Anne-Sophie Mouronval Introduction à la programmation des GPUs 17

Exemple de configuration test pour Nœud test "igloo-gpu" du mesocentre ECP : 1 nœud Altix ayant 2 processeurs quadri-cœurs Nehalem-EP à 2.26 GHz et 48 GiB de mémoire ; + 1 carte graphique Tesla M2050 (14 SMs de 32 cœurs soit 448 cœurs) à 1.15 GHz et 3 GiB de mémoire ; CUDA (Driver / Runtime / Capability : 5.0 / 5.0 / 2.0) ; PGI version 11.8 pour -Fortran. Un PC avec une carte graphique peut également convenir! Anne-Sophie Mouronval Introduction à la programmation des GPUs 18

Configurations pour en France Crihan (mesocentre de Haute-Normandie) : Antares (IBM), 13 TFlops en hybride, 28 GPUs NVIDIA ; CCRT / TGCC (Genci) : Curie (BULL), 200 TFlops en hybride, 288 GPUs NVIDIA ; CCRT / TGCC (Genci) : Titane (BULL), 192 TFlops (SP) en hybride, 192 GPUs NVIDIA.... Anne-Sophie Mouronval Introduction à la programmation des GPUs 19

Plan Introduction 1 Introduction GPU Intérêts pour le HPC 2 Streaming Multiprocessor Mémoires 3 Anne-Sophie Mouronval Introduction à la programmation des GPUs 20

CUDA Introduction CUDA : Compute Unified Device Architecture Développé par NVIDIA depuis 2007. Fait référence à l architecture et au modèle de programmation. Permet de programmer des GPUs en C / C++. Octobre 2012 : 5.0. PGI propose un compilateur pour -Fortran. Anne-Sophie Mouronval Introduction à la programmation des GPUs 21

Prérequis Introduction Installation Driver ; CUDA Toolkit (compilateur, outils de profilage, bibliothèques cublas, cufft...) ; CUDA SDK (Software Development Kit : exemples de codes...) Exemple : le programme bandwidthtest permet d effectuer des mesures de bande passante CPU-GPU. CUDA fonctionne avec les cartes NVIDIA GeForce, Quadro et Tesla. possibilité d utilisation avec des GPUs AMD via l outil opensource Ocelot. Anne-Sophie Mouronval Introduction à la programmation des GPUs 22

Un peu de vocabulaire Introduction Host : CPU. Device : GPU. Kernel : fonction s exécutant sur le GPU. Anne-Sophie Mouronval Introduction à la programmation des GPUs 23

Eléments clé d un programme CUDA Le programme contient le code pour le host et le device (extension.cu). Allocation de mémoire sur le GPU, transferts entre mémoires... Lancement du kernel sur le device par le host en précisant une grille d exécution (contexte). Anne-Sophie Mouronval Introduction à la programmation des GPUs 24

Exemple de programme simple CUDA #include <stdio.h> /* a simple CUDA kernel */ global void add( int a, int b, int *c ) { *c = a + b; } /* main */ int main( void ) { int c; int *dev_c; // GPU device memory allocation cudamalloc( (void**)&dev_c, sizeof(int) ) ; // perform computation on GPU add<<<1,1>>>( 2, 7, dev_c ); // get back computation result into host CPU memory cudamemcpy( &c, dev_c, sizeof(int), cudamemcpydevicetohost ) ; // output result on screen printf( "2 + 7 = %d\n", c ); // de-allocate GPU device memory cudafree( dev_c ) ; return 0; } Anne-Sophie Mouronval Introduction à la programmation des GPUs 25

Compilateur nvcc Introduction nvcc programme.cu -o programme Anne-Sophie Mouronval Introduction à la programmation des GPUs 26

Modèle de programmation Chaque SM a en charge la création, l organisation et l exécution de threads. Les threads exécutent simultanément des kernels. D un point de vue matériel, les threads sont organisés en warp (paquets de 32). Chaque SM peut contrôler jusqu à 48 warps simultanément, les warps en attente d un accès mémoire sont mis en attente. Accès mémoire globale sur GPU masqués par calculs ; optimisation de l utilisation des ressources. dépend de la version de capacité de calcul ("compute capability"). Anne-Sophie Mouronval Introduction à la programmation des GPUs 27

Organisation (logique) des threads en un ensemble structuré Grille 3D de blocs 3D de threads Dimensions de la grille en blocs : griddim(.x,.y,.z) ; Dimensions des blocs en threads : blockdim(.x,.y,.z) ; Indice d un bloc dans la grille : blockidx(.x,.y,.z) ; Indice d un thread dans son bloc : threadidx(.x,.y,.z). dépend de la version de capacité de calcul. Anne-Sophie Mouronval Introduction à la programmation des GPUs 28

Index d un thread Introduction Un thread d une grille est identifié par un index global unique. Exemple en 1D : index = threadidx.x + blockidx.x*blockdim.x; Grille blockidx.x= 0 1 2 blockdim.x=5 threadidx.x= 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 threadidx.x + blockidx.x*blockdim.x= 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 L index permet d établir une correspondance entre le thread et les données (éléments i d un tableau 1D par exemple...). Anne-Sophie Mouronval Introduction à la programmation des GPUs 29

Répartition des blocs sur les SM et extensibilité Anne-Sophie Mouronval Introduction à la programmation des GPUs 30

Modèle mémoire Introduction Thread r Registres Mémoire locale privée par thread Bloc Mémoire partagée par bloc Grille 0 Grille 1 Mémoire Mémoire globale globale par application Anne-Sophie Mouronval Introduction à la programmation des GPUs 31

Transferts entre mémoires du host et du device Allocation / désallocation mémoire sur le device cudaerror_t cudamalloc(void** devptr, size_t count); cudaerror_t cudafree(void* devptr); A comparer à l allocation / désallocation de mémoire sur le CPU void *malloc(size_t size); void free(void *ptr); Anne-Sophie Mouronval Introduction à la programmation des GPUs 32

Transferts entre mémoires du host et du device Copies entre mémoires du host et du device cudaerror_t cudamemcpy(void* dst, const void* src, size_t count, enum cudamemcpykind kind); copie count bytes de la zone mémoire pointée par src à celle pointée par dst. kind indique la direction de la copie (cudamemcpyhosttodevice, cudamemcpydevicetohost...). Les transferts (allocations, copies dans les 2 directions...) sont contrôlés par le CPU. Anne-Sophie Mouronval Introduction à la programmation des GPUs 33

Exemple de copie vers le device int main( void ) { // array size int N = 16; // host variable int *a // device variable int *dev_a // CPU memory allocation / initialization a = (int *) malloc(n*sizeof(int)); for (int i=0; i<n; i++) { a[i]=i; } // GPU device memory allocation / initialization cudamalloc( (void**)&dev_a, N*sizeof(int) ) ; cudamemcpy( dev_a, a, N*sizeof(int), cudamemcpyhosttodevice ) ; Anne-Sophie Mouronval Introduction à la programmation des GPUs 34

Kernel Introduction Fonction C lancée depuis le host et tournant sur le device : de type global ; retournant un void ; lancée à l aide d une syntaxe C modifiée de type : mykernel<<< griddim, blockdim >>>(parameters); griddim : dimensions de la grille en blocs, blockdim : dimensions des blocs en threads Tout kernel a accès automatiquement aux variables griddim, blockdim, blockidx et threadidx. Anne-Sophie Mouronval Introduction à la programmation des GPUs 35

Exemple de kernel CUDA (addition de vecteurs) /* a simple CUDA kernel */ global void add( int *a, int *b, int *c, int n ) { } int i = threadidx.x + blockidx.x*blockdim.x; if (i<n) c[i] = a[i] + b[i]; A comparer à l équivalent sur le host : /* Version CPU pour comparaison */ void add( int *a, int *b, int *c, int n ) { } int i ; for (i = 0; i < n; ++i) { c[i] = a[i] + b[i]; } Anne-Sophie Mouronval Introduction à la programmation des GPUs 36

Appel du kernel par le host : int nbthreads = 8; dim3 blocksize(nbthreads,1,1); dim3 gridsize(n/nbthreads,1,1); add<<<gridsize,blocksize>>>( dev_a, dev_b, dev_c, N ); Anne-Sophie Mouronval Introduction à la programmation des GPUs 37

Quelques questions fréquentes... Combien de threads mettre par bloc? Combien de blocs? Combien de mémoire partagée accessible par bloc?... Pour répondre à ces questions, une bonne connaissance des caractéristiques de sa carte (nombre maximum de threads par bloc...) est nécessaire! Ces informations peuvent être récupérées dans le code par la fonction cudagetdeviceproperties ou affichées via devicequery (SDK). Anne-Sophie Mouronval Introduction à la programmation des GPUs 38

devicequery Introduction devicequery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "Tesla M2050" CUDA Driver Version / Runtime Version 5.0 / 5.0 CUDA Capability Major/Minor version number: 2.0 Total amount of global memory: 2687 MBytes (2817982464 bytes) (14) Multiprocessors x ( 32) CUDA Cores/MP: 448 CUDA Cores GPU Clock rate: 1147 MHz (1.15 GHz) Memory Clock rate: 1546 Mhz Memory Bus Width: 384-bit L2 Cache Size: 786432 bytes (...) Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 32768 Warp size: 32 Maximum number of threads per multiprocessor: 1536 Maximum number of threads per block: 1024 Maximum sizes of each dimension of a block: 1024 x 1024 x 64 Maximum sizes of each dimension of a grid: 65535 x 65535 x 65535 Maximum memory pitch: 2147483647 bytes (...) Device has ECC support: Enabled (...) Anne-Sophie Mouronval Introduction à la programmation des GPUs 39

A voir aussi... Introduction De nombreux points n ont pas été abordés ici : L utilisation des différents types de mémoires (registres, mémoire partagée, mémoire de constantes...) ; La notion de flux (CUDA Streams) ; Les aspects de synchronisation entre threads ;... Anne-Sophie Mouronval Introduction à la programmation des GPUs 40

Plan Introduction 1 Introduction GPU Intérêts pour le HPC 2 Streaming Multiprocessor Mémoires 3 Anne-Sophie Mouronval Introduction à la programmation des GPUs 41

Introduction Open Computing Language Standard libre maintenu par Khronos Group depuis 2008. Projet initié par Apple. Nombreux partenaires investis dans le développement (AMD, NVIDIA, Intel...). Permet de programmer des systèmes hétérogènes combinant par exemple CPU et GPU (NVIDIA, AMD...). API et langage de programmation dérivé du C, utilisable dans des codes C / C++ et Python (Py). 2011 : 1.2 Anne-Sophie Mouronval Introduction à la programmation des GPUs 42

vs CUDA Introduction considéré comme plus complexe mais plus puissant. permet de programmer plus d accélérateurs (HWAs HardWare Accelerator ; GPUs NVIDIA et AMD, FPGA, DSP...), des processeurs Cell etc. Modèle mémoire et modèle d exécution hérités de CUDA (work-item = threads de CUDA, work-group = bloc, ND-Range = grille...). Connaissance préalable de CUDA conseillée. Anne-Sophie Mouronval Introduction à la programmation des GPUs 43

Etapes d un code Etapes typiques à effectuer dans le code de l hôte : Détection et sélection des devices (fonctions clgetplatformids, clgetdeviceids...) ; Initialisation du contexte (clcreatecontext) ; Création d une file de commandes (clcreatecommandqueue) ; Création de buffers mémoire sur le device (clcreatebuffer) ; Anne-Sophie Mouronval Introduction à la programmation des GPUs 44

Etapes d un code (suite) Création d une collection de kernels ("cl program") à partir des sources des kernels, compilation "just in time", création d objets kernel (clcreateprogramwithsource, clbuildprogram, clcreatekernel) ; Initialisation des arguments (clsetkernelarg) ; Définition du domaine d exécution (variable global_work_size...) ; Lancement du kernel (clenqueuendrangekernel) ; Récupération des résultats (clenqueuereadbuffer). Anne-Sophie Mouronval Introduction à la programmation des GPUs 45

Exemple de kernel kernel void vector_add_gpu ( global const float* src_a, global const float* src_b, global float* res, const int num) { /* ID of the thread in execution */ const int idx = get_global_id(0); } if (idx < num) res[idx] = src_a[idx] + src_b[idx]; Compilation du code avec gcc (par exemple) et édition des liens avec libopencl (le compilateur est "embarqué" dans la bibliothèque). Anne-Sophie Mouronval Introduction à la programmation des GPUs 46

Plan Introduction 1 Introduction GPU Intérêts pour le HPC 2 Streaming Multiprocessor Mémoires 3 Anne-Sophie Mouronval Introduction à la programmation des GPUs 47

Introduction Open Hybrid Multicore Parallel Programming Standard opensource initié en 2007, développé par CAPS et adopté par PathScale. repose sur les directives HMPP version 2.3 (2009). Compilateurs : HMPP (CAPS) et PathScale ENZO compiler suite. Anne-Sophie Mouronval Introduction à la programmation des GPUs 48

vs CUDA et Permet de programmer les architectures parallèles hybrides avec différents types de HWAs (GPU NVIDIA, GPU AMD, FPGAs...). Repose sur des directives. Permet de générer, entre autres, des codelets CUDA ou. Plus haut niveau d abstraction que CUDA et. Plus simple à utiliser, il est préférable cependant de connaître CUDA ou pour tirer parti de toutes ses possibilités. Utilisable dans les codes C, C++ et Fortran. Anne-Sophie Mouronval Introduction à la programmation des GPUs 49

Du code à l exécution sur le CPU et le HWA... Anne-Sophie Mouronval Introduction à la programmation des GPUs 50

Exemple de programme simple #pragma hmpp mycall codelet, target=cuda void myfunc( int n, int A[n], int B[n]) { int i; for (i=0 ; i<n ; ++i) B[i] = A[i] + 1; } void main(void) { int X[10000], Y[10000], Z[10000];... #pragma hmpp mycall callsite myfunc(10000, X, Y);... } Compilation : hmpp gcc programme.c Anne-Sophie Mouronval Introduction à la programmation des GPUs 51

Directives Introduction Permettent d indiquer les fonctions à exécuter sur le HWA, gérer leur appel et les transferts de données entre mémoires... Syntaxe C #pragma hmpp [codelet_label] directive_type [,parmameters] [&] Syntaxe Fortran!$hmpp [codelet_label] directive_type [,parameters] [&] Anne-Sophie Mouronval Introduction à la programmation des GPUs 52

codelet et callsite Introduction 2 directives importantes : codelet et callsite codelet identifie la fonction à porter sur l accélérateur. le paramètre target permet de spécifier le langage cible (CUDA,...). #pragma hmpp mylabel codelet, target=cuda,... void myfunc(...){... } callsite spécifie l usage d un codelet à un point donné dans le programme.... #pragma hmpp mylabel callsite, asynchronous,... myfunc(...);... Anne-Sophie Mouronval Introduction à la programmation des GPUs 53

Plan Introduction 1 Introduction GPU Intérêts pour le HPC 2 Streaming Multiprocessor Mémoires 3 Anne-Sophie Mouronval Introduction à la programmation des GPUs 54

Introduction Standard ouvert. Consortium : depuis 2011, CAPS, Cray, PGI (Portland Group Inc) et NVIDIA. Depuis 2012, Allinea, Georgia Tech, ORLN... Décembre 2012 : 1.0. Compilateurs supportant : PGI (à partir de 12.6), celui de Cray et celui de CAPS (HMPP, depuis 3.1). Anne-Sophie Mouronval Introduction à la programmation des GPUs 55

vs Comme, Repose sur des directives. Utilisable dans les codes C, C++ et Fortran... est actuellement moins riche que Pas de gestion de devices multiples. Pas d utilisation de bibliothèques pour accélérateurs par des directives. Pas d intégration possible de kernels CUDA déjà écrits.... Anne-Sophie Mouronval Introduction à la programmation des GPUs 56

Exemple de programme simple Exemple sur le calcul de π (tiré de Nvidia Developper Zone) program picalc implicit none integer, parameter :: n=1000000 integer :: i real(kind=8) :: t, pi pi = 0.0!$acc parallel loop reduction(+:pi) do i=0, n-1 t = (i+0.5)/n pi = pi + 4.0/(1.0 + t*t) end do!$acc end parallel loop print *, pi=, pi/n end program picalc Compilation avec hmpp : hmpp gfortran programme.f90 Anne-Sophie Mouronval Introduction à la programmation des GPUs 57

Directives Introduction Permettent d indiquer les parties du code à exécuter sur le HWA, gérer les transferts de données entre mémoires... Syntaxe C #pragma acc directive-name[clause[[,]clause]...] {... } Syntaxe Fortran!$acc directive-name[clause[[,]clause]...]!$acc end directive-name Anne-Sophie Mouronval Introduction à la programmation des GPUs 58

Constructions kernels, parallel Directives importantes pour le parallèlisme : parallel, kernels et loop Gangs et workers : clauses num_gangs[], num_workers[] #pragma acc parallel, num_gangs[32], num_workers[256] { #pragma acc loop gang for(i=0; i < n; i++) {... }... } Directive data (clauses create, copy, pcopy...) pour la gestion des données. Anne-Sophie Mouronval Introduction à la programmation des GPUs 59

Accélérateurs : nouvelles tendances Chez AMD : APU (Accelerated Processing Unit) AMD Fusion : CPU et GPU sur une même puce avec partition mémoire. Chez NVIDIA : Denver Project, Tegra (CARMA : kit de développement CUDA pour les systèmes ARM accélérés par les GPUs NVIDIA). Chez Intel : Co-processeur Xeon-Phi (Mic : Intel Many Integrated Core Architecture). Puce AMD Fusion Xeon Phi Anne-Sophie Mouronval Introduction à la programmation des GPUs 60

Conclusion Introduction Architectures évoluant rapidement (lien avec les systèmes embarqués). Plusieurs solutions de programmation souvent récentes et en évolution. Certains solutions permettent de programmer plusieurs types de GPUs et d autres HWAs mais problème de "portabilité de la performance". Anne-Sophie Mouronval Introduction à la programmation des GPUs 61

Références Introduction Introduction to GPU computing with CUDA, P. Kestener, PATC Training, Maison de la Simulation, 2012., an introduction, G. Colin de Verdière, Formation "Initiation à la programmation des GPU", Maison de la Simulation, 2011. Programmation par directives pour le calcul hybride : HMPP et, CAPS, Ecole "Programmation hybride : une étape vers le many-coeurs?", Groupe Calcul, Autrans, 2012 (disponible sur http ://calcul.math.cnrs.fr). Anne-Sophie Mouronval Introduction à la programmation des GPUs 62

Références (suite) Introduction Site de NVIDIA (CUDA) : http ://www.nvidia.com Site de Khronos () : http ://www.khronos.org/opencl/ Site de CAPS (HMPP) : http ://www.caps-entreprise.com Site de : http ://www.openacc-standard.org/ Anne-Sophie Mouronval Introduction à la programmation des GPUs 63