• Aucun résultat trouvé

CHAPITRE 4 : MÉTHODES DE RECONSTRUCTION : PROBLÈME INVERSE

5.1 Architecture matérielle CUDA des GPUs Fermi

langage BrookGPU, qui est une extension de C permettant de créer une interface haut niveau avec les API graphiques OpenGL et DirectX. L’objectif était de faire d’un GPU un coprocesseur du CPU spécialisé dans les calculs parallèles. La principale limitation du langage Brook est le problème de compatibilité avec les nouvelles versions GPU. Mais, il a le mérite d’être le pio- nnier de l’architecture GPGPU (General-Purpose Computing on Graphics Processing Units) qui a fait du GPU un outil puissant pour accélérer les calculs dans plusieurs domaines, tels que le graphisme et l’imagerie médicale.

Cependant, l’engouement pour l’utilisation des GPUs pour effectuer des calculs scientifiques complexes a eu lieu à partir, principalement, de 2007 lorsque NVIDIA a introduit CUDA (Com- pute Unified Device Architecture) qui est une plateforme GPGPU. Cette dernière désigne une architecture matérielle et un environnement logiciel qui permet d’exécuter sur les processeurs GPU, d’une manière parallèle et efficiente, des programmes de calcul écrits dans des langages de haut niveau tels que C, C++, Fortran, DirectCompute et OpenCL. Depuis cette date, plusieurs librairies mathématiques ont été aussi développées pour faciliter la programmation CUDA [1]. Plusieurs travaux d’accélération des calculs sur GPU ont été aussi publiés dans différents do- maines. Dans le domaine de la reconstruction des images en TEP, nous notons près d’une cen- taine de travaux publiés jusqu’à maintenant.

5.1 Architecture matérielle CUDA des GPUs Fermi

Le GPU est une carte électronique prériphérique (Device en anglais) insérable dans le bus PCIe de la carte mère d’un ordinateur CPU hôte (figure 5.1). Dans l’architecture CUDA, le GPU est composé essentiellement d’une puce (chip) contenant un certain nombre de multiprocesseurs SMPs (Streaming Multiprocesseurs), et une mémoire vive dynamique DRAM (Dynamic Random Access Memory) à l’extérieur de la puce qui contient les SMPs (off-chip). Chaque SMP contient un certain nombre de processeurs SPs (Streaming Processor).

Jusqu’à maintenant, NVIDIA a développé trois grandes classes de GPUs d’architecture CUDA ayant différentes capacités de calcul, telles que les architectures Tesla, Fermi et Kepler et qui sup- portent respectivement les capacités de calcul 1.x, 2.x et 3.x, où x est un nombre qui définit les sous-versions des GPUs reflétant des améliorations mineures par rapport à l’une des trois classes d’architectures principales. Par simplification du langage, nous allons, dans ce qui suit, désigner par exemple : "GPU ayant les capacités de calcul 1.3" par : " GPU 1.3". Le GPU Tesla C2050,

5.1. ARCHITECTURE MATÉRIELLE CUDA DES GPUS FERMI

utilisé dans notre travail, a une architecture Fermi avec 14 SMPs et supporte les capacités de calcul 2.0. Comme le montre la figure 5.2, chaque SMP de l’architecture Fermi contient :

– 32 SPs dont chacun contient une unité ALU (Arithmetic Logic Unit) pour les opérations arithmétiques et logiques sur des entiers et une unité FPU (Floating Point Unit) pour les opérations en virgule flottante. Cette architecture permet à chaque SMP d’effectuer 32 opérations arithmétiques en simple précision (32 bits) par cycle d’horloge sur des entiers et des nombres en virgules flottantes, et 16 opérations sur les nombres en double précision (64 bits). Fermi supporte en simple et double précision le nouveau standard IEEE 754-2008 qui permet de fusionner les opérations d’addition et multiplication dans une seule opération (FMA : Fused Multiply-Add). Un FMA calcule en une seule instruction D = A ∗ B +C sans perte de précision.

– 4 unités de fonctions spéciales SFUs (Special Function Unit) pour exécuter les fonctions transcendantes comme le cosinus, le sinus, la racine carrée et leur inverse. Chaque SFU exécute une opération par fil d’exécution (thread) par cycle d’horloge.

– 32768 registres de 32 bits (32 ko), un cache pour les instructions et deux unités de pla- nification et de distribution des fils d’exécution (two multithreaded warp schedulers and instruction dispatch units). Chaque SMP exécute en concurrence deux groupes de 32 fils d’exécution chacun qu’on appelle warps. Chaque unité warp scheduler sélectionne un warpet envoie une instruction d’exécution à 16 SPs. Les 32 fils d’exécution de chaque warpsont exécutés en 2 et 4 cycles respectivement pour les opérations simples et doubles précisions.

– 16 unités de lecture et d’enregistrement (load/store units) permettant de calculer par cycle d’horloge 16 positions d’adresses mémoires.

– 64 ko de mémoire cache de premier niveau par SMP et qui est configurable pour être partagée entre la mémoire cache L1 et la mémoire partagée (shared memory). L’utilisateur peut attribuer 16 ko à L1 et 48 ko à la mémoire partagée ou 48 ko à L1 et 16 ko à la mémoire partagée. L1 permet d’offrir à chaque SMP un cache pour l’accès plus rapide- ment à la mémoire DRAM et aux registres temporaires résidant dans la mémoire DRAM. Lorsqu’elle est utilisée correctement, la mémoire partagée permet d’accélérer l’accès à la mémoire DRAM.

– Une mémoire L2 (uniform cache) de deuxième niveau de capacité 768 ko qui sera utilisée comme cache de la mémoire DRAM pour tous les SMPs. L2 offre au SMP un accès rapide

5.1. ARCHITECTURE MATÉRIELLE CUDA DES GPUS FERMI

à la mémoire DRAM pour les requêtes de lecture et d’enregistrement, et pour les demandes de service de texture et des opérations atomiques. L2 permet de diminuer énormément la latence d’accès à la mémoire DRAM, surtout pour les applications où l’accès à la mémoire DRAM se fait d’une manière aléatoire, c’est à dire les applications où les adresses ne sont pas connues auparavant pour optimiser l’accès par coalescence, ce qui est le cas de la reconstruction des images TEP à partir des données en mode liste.

Les fonctions atomiques permettent à un seul fil d’exécution de lire une donnée à partir d’une position mémoire, de la modifier et puis d’écrire le résultat dans la même case mémoire. Les autres fils d’exécution ne peuvent accéder à cette case mémoire que lorsque la boucle (lire, modifier et écrire) est complétée par le premier fil d’exécution. Parmi ces fonctions, on cite la fonction atomicAdd() qui permet de modifier le contenu, en virgule flottante, d’une case mémoire par une addition d’une autre valeur. Cette dernière est très importante dans la reconstruction des images en TEP, car elle permet de réaliser une rétroprojection des données d’acquisition dans l’image sans perte. Grâce à l’implantation au niveau matériel de plus d’unités de calcul atomique et l’utilisation de la mémoire L2, l’architecture Fermi permet d’accélérer les fonctions atomiques de plus de 20 fois par rapport aux GPUs de la génération précédente.

Figure 5.1 – Image de la carte GPU Tesla C2050.

La communication entre la puce GPU et sa mémoire DRAM se fait via 6 contrôleurs haute vitesse GDDR5 (Graphics Double Data Rate, version 5) de 64 bits chacun (bus de 512 bits) permettant une grande bande passante théorique de 140 Go/s. Par contre la bande passante de la communication entre la mémoire DRAM de GPU et la mémoire RAM CPU de l’hôte à travers