Bienvenue à l'Onera, le centre français de recherche aérospatiale

Ligne orange
Bouton Aronautique Bouton Espace Bouton Dfense et scurit Bouton Transfert de technologie Bouton Souffleries

ENGLISH

RECHERCHE DIRECTE

L’Onera de A à Z

ONERA-ISA

ONERA-ISA

Traitement de l'information et modélisation

GPU for Image : Notions générales sur la programmation CUDA

Présentation du calcul sur GPU

Les développements présentés ici utilisent le langage de programmation CUDA développé par nVidia. Nous disposons des GPU de la gamme professionnelle « Tesla » ainsi que des GPU grand public de la gamme GTX 280. 

Un GPU est une carte graphique reliée au CPU (processeur central) via un port PCI express. Sur la figure 1, nous présentons l'architecture d'un PC moderne. Un point important est que la bande passante entre le CPU et le GPU est faible comparé à celle que ces deux processeurs ont vers leurs mémoires respectives.


Figure 1. Architecture d’un ordinateur moderne

La notion importante pour la programmation d’un GPU n’est pas son architecture hardware mais le modèle de programmation, ou grille de calcul, représenté en Figure 2. La grille de calcul est une grille à deux niveaux de granularité.


Figure 2. Modèle de calcul d’un GPU

Le niveau le plus grossier est composé de blocs (blocks) exécutés indépendamment les un des autres, sur lesquels le programmeur ne possède aucun contrôle d'exécution. Les blocs sont constitués d'un ensemble de « threads » : le thread est le plus petit élément d’éxécution dans un GPU. Le programmeur a la possibilité de contrôler l'exécution de ces threads par des points de synchronisation et peut faire échanger des informations entre les threads grâce à de la mémoire partagée. La programmation d'une fonction GPU avec CUDA se décompose en deux étapes :

  1. Définir la géométrie des deux niveaux de la grille de calcul (blocks et threads), cette géométrie pouvant être décrite par un indiçage en 1, 2 ou 3 dimensions ;
  2. Définir la fonction exécutée par tous les threads : appelée noyau (kernel), cette fonction doit être préférentiellement courte et comprendre le moins de branchements (i.e. instruction if) possibles. Notons que des variables spéciales sont disponibles pour obtenir les informations de position du thread sur la grille de calcul : taille des blocs, taille de la grille, indice du bloc, indice du thread.

Figure 3. Structure de la mémoire accessible au GPU

Un aspect essentiel de la programmation efficace sur GPU est la gestion des mémoires partagées : la structure de la mémoire est présentée en figure 3. L’accès des threads à la mémoire globale à un temps de la latence important, il convient donc d’utiliser un système de cache à l’aide des mémoires locales disponibles dans chaque bloc (registres, shared memory) dont le temps d’accès est très rapide (comparable au cache L1 des CPU).


 



Précédente | Haut | Suivante


Accueil GPU for Image

La programmation GPU

FOLKI-GPU

FOLKI-PIV

FOLKI-NECT

Téléchargements

Les auteurs

 


Mis à jour le - © ONERA 2008 - Crédits et conditions d'utilisation