2 votes

Questions sur le cuda

Je fais une recherche sur la programmation GPU et je souhaite en savoir plus sur CUDA. J'ai déjà lu beaucoup de choses à ce sujet (sur Wikipedia, Nvidia et d'autres références) mais j'ai encore quelques questions :

  1. La description suivante de l'architecture est-elle exacte : un GPU comporte des multiprocesseurs, chaque multiprocesseur comporte des processeurs de streaming et chaque processeur de streaming peut exécuter des blocs de threads en même temps.

  2. Toutes les références indiquent que le nombre minimum de threads à créer à l'intérieur d'un bloc est de 32... pourquoi ?

  3. J'ai une carte vidéo ATI Radeon. et j'ai pu compiler un programme CUDA simple sans mode émulation !!!. Je pensais que je ne pouvais compiler et exécuter des programmes CUDA que sur des VGA Nvidia compatibles. Quelqu'un peut-il m'expliquer ?

6voto

goger Points 537

1 - C'est vrai pour les processeurs NVIDIA.

2 - Il s'agit d'une contrainte liée à la conception du matériel.

3 - la compilation est effectuée sur le processeur, vous pouvez donc compiler votre programme de la même manière que vous pouvez effectuer une compilation croisée pour PPC sur un x86.

Si vous souhaitez exécuter des programmes gpu sur une carte ATI, je vous suggère de vous tourner vers OpenCL ou AMD Stream.

6voto

Tom Points 12285

Un thread CUDA est très léger et peut être planifié/installé avec très peu de pénalités. À la différence d'un thread de l'unité centrale, dont l'entrée et la sortie de l'exécution entraînent des frais généraux importants. Par conséquent, les CPU sont parfaits pour le parallélisme des tâches et les GPU excellent dans le parallélisme des données.

  1. Dans l'architecture CUDA, un GPU (NVIDIA) possède des "multiprocesseurs de flux" (SM), chacun d'entre eux exécutant un bloc de threads. Chaque SM possède un ensemble de processeurs de flux (SP), chacun d'entre eux exécutant les instructions d'un thread à un moment donné (cycle).

  2. En fait, le nombre minimum de fils à l'intérieur d'un bloc est de un. Si vous n'avez qu'un seul thread par bloc, votre code s'exécutera correctement. Toutefois, il est beaucoup plus efficace de configurer un bloc de manière à ce qu'il comporte un multiple de 32 threads. Cela est dû à la manière dont le matériel planifie les opérations sur une "chaîne" de 32 threads.

  3. Vous pouvez effectuer une compilation croisée de votre programme. Vous pouvez l'exécuter en mode émulation, c'est-à-dire que le CPU "émule" un GPU CUDA, mais pour l'exécuter sur du matériel, vous aurez besoin d'un GPU NVIDIA (compatible avec CUDA, tout ce qui est récent, après 2006 environ, fera l'affaire).

Un GPU haut de gamme de la génération actuelle possède 240 cœurs (SPs). On pourrait considérer qu'il exécute 240 threads à tout moment, mais il est utile de considérer que le GPU exécute milliers de threads simultanément puisque l'état (contexte) de plusieurs threads est chargé.

Je pense qu'il est important de reconnaître qu'il existe des différences entre les threads du CPU et ceux du GPU. Ils portent le même nom, mais un thread GPU est léger et opère généralement sur un petit sous-ensemble de données. Il peut être utile de penser à un (ensemble de) thread(s) de l'unité centrale effectuant le travail non parallèle, puis chaque thread de l'unité centrale se divise en milliers de threads du GPU pour le travail parallèle sur les données, avant de rejoindre le thread de l'unité centrale. Il est clair que si vous pouvez faire en sorte que le thread de l'unité centrale effectue le travail en même temps que le GPU, ce sera encore mieux.

Rappelez-vous que, contrairement à un CPU, un GPU est une architecture de débit, ce qui signifie qu'au lieu d'utiliser des caches pour cacher la latence, le programme devrait créer de nombreux threads de sorte que, pendant que certains threads attendent que les données reviennent de la mémoire, d'autres threads peuvent s'exécuter. Je vous recommande de regarder la présentation "Advanced C for CUDA" de la conférence Conférence sur la technologie GPU pour plus d'informations.

2voto

Die in Sente Points 5387
  1. Oui. Chaque GPU est un tableau de processeurs vectoriels ou SIMD (Single-Instruction Multiple Data). Au sein d'un vecteur unique de threads - qui peut être de 32, 64 ou d'un autre nombre en fonction du GPU - chaque thread exécute la même instruction de votre noyau en lock step. Cette unité de base est parfois appelée "warp" ou "wavefront" ou encore "SIMD".

    32 semble être la norme pour les puces NVidia, 64 pour les puces ATI. IIRC, le chiffre pour la puce Larrabee d'Itel est censé être encore plus élevé, si cette puce est un jour fabriquée.

  2. Au niveau matériel, les threads sont exécutés dans ces unités, mais le modèle de programmation vous permet d'avoir un nombre arbitraire de threads. Si votre matériel implémente un front d'onde d'une largeur de 32 et que votre programme ne demande qu'un seul thread, 31/32 de cette unité matérielle resteront inactifs. Créer des threads par multiples de 32 (ou autre) est donc la manière la plus efficace de procéder (en supposant que vous puissiez le programmer de manière à ce que tous les threads fassent un travail utile).

    Ce qui se passe en fait dans le matériel, c'est qu'il y a au moins un bit pour chaque thread, qui indique si le thread est "vivant" ou non. Les threads inutilisés supplémentaires dans un front d'onde de 32 effectueront effectivement des calculs, mais ne seront pas en mesure d'écrire les résultats dans un emplacement de mémoire, de sorte que c'est comme s'ils n'avaient jamais été exécutés.

    Lorsqu'un GPU effectue le rendu graphique d'un jeu, chaque thread calcule un seul pixel (ou un sous-pixel si l'anticrénelage est activé), et chaque triangle rendu peut avoir un nombre arbitraire de pixels, n'est-ce pas ? Si le GPU ne pouvait rendre que des triangles contenant un multiple exact de 32 pixels, cela ne fonctionnerait pas très bien.

  3. La réponse de Goger en dit long.

  4. Bien que vous ne l'ayez pas spécifiquement demandé, il est également très important pour vous, les noyaux GPU, d'éviter les branches. Puisque les 32 threads d'un front d'onde doivent exécuter la même instruction en même temps, que se passe-t-il lorsqu'il y a et if .. then .. else dans le code ? Si certains threads de la chaîne veulent exécuter la partie "then" et d'autres la partie "else" ? La réponse est que les 32 threads exécutent les deux parties ! Ce qui prendra évidemment deux fois plus de temps, de sorte que votre noyau fonctionnera à la moitié de sa vitesse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X