3.Programmation des processeurs graphiques avec l'architecture de programmation parallèle CUDA

Documents pareils
Introduction à CUDA.

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

Introduction à la programmation des GPUs

Calcul multi GPU et optimisation combinatoire

Une bibliothèque de templates pour CUDA

Initiation au HPC - Généralités

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

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

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

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Conception de circuits numériques et architecture des ordinateurs

Algorithmique I. Algorithmique I p.1/??

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Structure fonctionnelle d un SGBD

La mémoire. Un ordinateur. L'octet. Le bit

Introduction à la Programmation Parallèle: MPI

TP1 : Initiation à Java et Eclipse

Cours Informatique Master STEP

Chapitre V : La gestion de la mémoire. Hiérarchie de mémoires Objectifs Méthodes d'allocation Simulation de mémoire virtuelle Le mapping

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

Analyse de performance, monitoring

Seance 2: En respectant la méthode de programmation par contrat, implémentez les autres fonctions de jeu.

Introduction au langage C

Institut Supérieure Aux Etudes Technologiques De Nabeul. Département Informatique

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

SYSTÈME DE GESTION DE FICHIERS

TP1 : Initiation à Java et Eclipse

Guide d'installation. Release Management pour Visual Studio 2013

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Introduction au calcul parallèle avec OpenCL

ACTIVITÉ DE PROGRAMMATION

SYSTÈME DE GESTION DE FICHIERS SGF - DISQUE

Éléments d'architecture des ordinateurs

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Cours Langage C/C++ Programmation modulaire

Cours 1 : La compilation


Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Architecture des calculateurs

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

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

Tests de performance du matériel

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Parallélisme et Répartition

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

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Diagramme de classes

Fonctionnement et performance des processeurs

Cours Programmation Système

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Architecture des ordinateurs

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

TP réseaux 4 : Installation et configuration d'un serveur Web Apache

Conventions d écriture et outils de mise au point

Télécom Nancy Année

Problèmes liés à la concurrence

Livre blanc Mesure des performances sous Windows Embedded Standard 7

1/ Présentation de SQL Server :

Chap III : Les tableaux

Cours Informatique 1. Monsieur SADOUNI Salheddine

Mise en oeuvre TSM 6.1

Virtual PC Virtual PC 2007 Page I

Chapitre I Notions de base et outils de travail

Cours: Administration d'une Base de Données

TAI049 Utiliser la virtualisation en assistance et en dépannage informatique TABLE DES MATIERES

Le langage C. Séance n 4

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

Préparer la synchronisation d'annuaires

Projet Active Object

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

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

Rappels d architecture

CH.3 SYSTÈMES D'EXPLOITATION

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

INF6500 : Structures des ordinateurs. Sylvain Martel - INF6500 1

Exécutif temps réel Pierre-Yves Duval (cppm)

ESXi: Occupation RAM avec VM_Windows et VM_Linux. R. Babel, A. Ouadahi April 10, 2011

DUT. Informatique, orientation Imagerie Numérique. Domaine : Sciences, Technologies, Santé. Mention : Informatique

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Guide de l'utilisateur

Mise en oeuvre d'une base de données mono-utilisateur avec SQLite

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

Programme détaillé. Administrateur de Base de Données Oracle - SQLServer - MySQL. Objectifs de la formation. Les métiers

Symantec Backup Exec.cloud

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

CONFIGURATION DE L AUTOMATE SIEMENS

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

Université du Québec à Chicoutimi. Département d informatique et de mathématique. Plan de cours. Titre : Élément de programmation.

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

CYCLE CERTIFIANT ADMINISTRATEUR BASES DE DONNÉES

TP1. Outils Java Eléments de correction

Chapitre 1 : La gestion dynamique de la mémoire

Chapitre 4 : Les mémoires

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Architecture des Ordinateurs. Partie II:

Transcription:

Travaux pratiques d'informatique Parallèle et distribuée,, TP 3 1 3.Programmation des processeurs graphiques avec l'architecture de programmation parallèle CUDA 3.1.Objectifs Les objectifs de la séance sont de: 3.2.Généralités se familiariser avec la syntaxe de CUDA se familiariser avec le compilateur nvcc réaliser des programmes tournant sur les processeurs graphiques CUDA (Compute Unified Device Architecture) est une architecture de programmation parallèle développée par NVIDIA. Elle étend le langage C avec des fonctionnalités permettant la programmation sur processeur graphique. La compilation d'un code CUDA nécessite l'emploi du compilateur nvcc développé par NVIDIA. Ce compilateur s'utilise de la même manière que gcc : nvcc code.cu o executable 3.3.Déroulement de l'exécution Un programme tournant sur GPU s'exécute en 5 étapes : 1. La mémoire dédiée au CPU (mémoire hôte) et la mémoire dédiée au GPU (mémoire device) étant distinctes, les données utilisées sur le processeur graphique doivent être transférées dans la mémoire dédiée à ce dernier. 2. Le CPU demande au GPU d'exécuter le programme (le kernel) et spécifie le nombre de threads à lancer. 3. Au cours du traitement, les données sont chargées depuis la mémoire device dans les registres des ALUs ou dans les autres mémoires (partagée, constante, ) des multiprocesseurs. 4. Les résultats du calcul sont placés dans la mémoire device. 5. Les résultats sont transférés dans la mémoire hôte. 1

Travaux pratiques d'informatique Parallèle et distribuée,, TP 3 2 3.4.Programmation a) Sélection du processeur graphique : La sélection du GPU utilisé par le programme s'effectuer à l'aide de la fonction cudasetdevice : cudaerror_t cudasetdevice (int device) Cette fonction indique au programme qu'il doit utiliser le GPU d'identifiant device. S'il y a n GPU sur une machine, device peut valoir une valeur être comprise entre 0 et n 1. b)allocation en mémoire device et transfert des données CPU => GPU L'allocation de la mémoire s'exécute à l'aide de la fonction cudamalloc : cudaerror_t cudamalloc (void ** devptr, size_t size) Cette fonction réserve, dans la mémoire device, un espace mémoire de taille size dont l'adresse est contenue dans le pointeur devptr. Le transfert des données s'exécute via la fonction cudamemcpy : cudaerror_t cudamemcpy (void * dst, const void * src, size_t count, enum cudamemcpykind kind) Cette fonction transfert count octets de l'espace mémoire src vers l'espace mémoire dst. La variable kind doit être mise à : cudamemcpyhosttodevice dans le cas d'un transfert CPU ==> GPU cudamemcpydevicetohost dans le cas d'un transfert GPU ==> CPU c) Appel du kernel Le kernel est une fonction destinée à tourner sur GPU. Elle se distingue des fonctions habituelles par son en tête précédé par l'un de ces mots clés : global : indique que la fonction est appelée depuis le CPU device : indique que la fonction est appelée depuis le GPU Lorsque le GPU exécute un kernel, les instructions sont chargées dans les multiprocesseurs et les ALUs exécutent simultanément la même instruction (mode de fonctionnement SIMD Single Instruction Multiple Data). Le nombre de thread s'exécutant ainsi en parallèle est déterminé par l'utilisateur lors de l'appel au kernel : kernel<<<nombre_de_blocs,nombre_de_threads_par_bloc>>>(arguments); Les threads se situent dans des blocs et le nombre total de thread lancé est égal à Nombre_de_blocs* Nombre_de_threads_par_bloc. Ces dernières variables peuvent soit être des scalaires, soit des variables de types dim3 : dim3 var(x,y,z) Dans ce dernier cas, les threads et les blocs occupent plusieurs dimensions, pouvant ainsi mieux représenter la répartition des données. Par exemple, l'appel kernel<<<(2,2,1), (2,2,1)>>>(arguments); crée la grille de threads présentée à la page suivante.

Travaux pratiques d'informatique Parallèle et distribuée,, TP 3 3 d)identification des threads Le même programme s'exécutant sur tous les coeurs, l'identifiant du thread est le moyen unique de différencier les exécutions. Celui ci peut être récupéré grâce aux variables blockdim, blocksize et threadid. Dans le cas d'une grille de threads en deux dimensions, voici comment situer le thread sur les deux axes : int x = blockid.x * blockdim.x + threadid.x; int y = blockid.y * blockdim.y + threadid.y; e) Les types de mémoires dédiées au processeur graphique La gestion de la mémoire doit être assurée par l'utilisateur et il est donc important d'en connaître les caractéristiques. Cette séance de travaux pratiques exploite trois types de mémoires : 1. La mémoire globale : cette mémoire correspond à la mémoire RAM du processeur graphique et possède la plus grande latence d'accès aux données (de 400 à 600 cycles d'horloge). C'est là que les données sont placées par la fonction cudamemcpy. 2. Les registres : cette mémoire correspond aux registres de travail des ALUs, ce qui en fait la mémoire qui possède la latence la plus basse (1 cycle d'horloge). Une donnée est placée dans un registre lorsqu'elle est placée dans une variable déclarée au sein d'un kernel. 3. La mémoire partagée : cette mémoire se trouve dans le SM. Une donnée placée en mémoire partagée est accessible par tous les threads d'un même bloc. Pour déclarer une variable dans la mémoire partagée, il suffit de faire précéder sa déclaration au sein du kernel par le mot clé shared (Exemple : shared int variable;). Elle possède une latence de 4 cycles d'horloge. Cette mémoire étant partagée entre plusieurs threads, il se peut qu'une synchronisation soit nécessaire afin de s'assurer que les données soient bien écrites en mémoire. Pour ce faire, il suffit d'appeler la fonction syncthreads() qui synchronise les threads d'un même bloc. Type de mémoire Utilité Taille Latence (cycles) Globale Mémoire principale Jusqu'à 4 Go 400 à 600 Registres Propre à chaque thread 8192 * 4 octets 1 Partagée Communications entre threads 16 ko 4

Travaux pratiques d'informatique Parallèle et distribuée,, TP 3 4 f) Récupération des résultats et libération de la mémoire La récupération des résultats sur le CPU s'effectue grâce à la fonction cudamemcpy, avec la variable kind mise à cudamemcpydevicetohost. Lorsque l'espace mémoire allouée sur le GPU peut être libéré, un appel à cudafree doit être exécuté : cudaerror_t cudafree(void * devptr) devptr contient l'adresse mémoire à libérer. 3.5.Optimisation a) Nombre de threads par multiprocesseur L'utilisateur crée les threads par bloc et le GPU les exécute sur ses coeurs par lot de 32. Le nombre de threads par bloc est un moyen d'influencer l'exécution et donc les performances. Voici les contraintes qui déterminent l'assignement des blocs de threads aux multiprocesseurs : Avec : p*b <= 768 : maximum 768 threads peuvent être attribué à un multiprocesseur r*p*b <= R : il ne faut pas dépasser la quantité de registres disponibles s*b <= S : il ne faut pas dépasser la quantité de mémoire partagée disponible b <= 8 : limite matérielle p <= 512 : limite matérielle p = nombre de threads par bloc b = nombre de blocs assignés au multiprocesseur r = nombre de registres utilisés par threads R = nombre de registres disponibles pour un multiprocesseur s = quantité de mémoire partagée utilisée par bloc S = quantité de mémoire partagée disponible par multiprocesseur Il est possible de voir la quantité de registres et la taille de la mémoire partagée utilisés en utilisant l'option de compilation ptxas option= v. b)fusion des accès mémoire Lorsque des threads adjacents accèdent en mémoire globale à des espaces adjacents, les accès mémoires sont fusionnés. Ce mécanisme permet de nettement diminuer la latence d'accès aux données.

Travaux pratiques d'informatique Parallèle et distribuée,, TP 3 5 3.6.Exercice 1. Écrire un programme séquentiel qui effectue la multiplication d'un vecteur par une matrice à nombre de lignes variable. 2. Porter sur processeur graphique le programme conçu au point 1. 3. Observer l'impact du nombre de threads par bloc sur les temps d'exécution. 4. Dérouler la boucle à l'intérieur du kernel. 5. Fusionner les accès à la mémoire globale. 6. Fixer la taille du vecteur à 16 et utiliser la mémoire partagée et les registres.