CUDA: Combien de threads simultanés au total?

Je possède une GeForce GTX 580 et je veux faire une déclaration sur le nombre total de threads qui peuvent (idéalement) être exécutés en parallèle, à comparer avec 2 ou 4 processeurs multi-cœurs.

deviceQuery me donne les informations suivantes éventuellement pertinentes:

CUDA Capability Major/Minor version number: 2.0 (16) Multiprocessors x (32) CUDA Cores/MP: 512 CUDA Maximum number of threads per block: 1024 

Je pense avoir entendu que chaque cœur de CUDA peut exécuter une chaîne en parallèle, et qu’un Warp est composé de 32 threads. Serait-il correct de dire que la carte peut exécuter 512 * 32 = 16384 threads en parallèle à ce moment-là, ou est-ce que je suis loin et que les cœurs CUDA ne fonctionnent pas vraiment en parallèle?

La GTX 580 peut avoir 16 * 48 warps simultanés (32 threads chacun) fonctionnant à la fois. C’est-à-dire 16 multiprocesseurs (SM) * 48 distorsions résidentes par SM * 32 threads par chaîne = 24 576 threads.

Ne confondez pas la concurrence et le débit. Le nombre ci-dessus est le nombre maximum de threads dont les ressources peuvent être stockées simultanément sur la puce – le nombre pouvant être résident . En termes de CUDA, nous appelons également cette occupation maximale. Le matériel bascule constamment entre les chaînes pour aider à couvrir ou à “masquer” la latence (importante) des access à la mémoire ainsi que la (faible) latence des pipelines arithmétiques.

Bien que chaque SM puisse avoir 48 distorsions résidentes, il ne peut émettre que des instructions à partir d’un petit nombre (en moyenne entre 1 et 2 pour la GTX 580, mais cela dépend du mélange d’instructions du programme).

Il est donc préférable de comparer le débit, qui est déterminé par les unités d’exécution disponibles et la capacité du matériel à effectuer plusieurs éditions. Sur GTX580, il y a 512 unités d’exécution FMA, mais aussi des unités entières, des unités de fonctions spéciales, des unités d’instruction mémoire, etc.

Tenir compte de tout ce qui précède est trop difficile, donc la plupart des gens comparent sur deux mésortingques:

  1. GFLOP / s de pointe (qui pour GTX 580 est de 512 unités FMA * 2 flops par FMA * 1544e6 cycles / seconde = 1581.1 GFLOP / s (simple précision))
  2. Débit mesuré sur l’application qui vous intéresse

La comparaison la plus importante est toujours la mesure de l’heure de l’horloge sur une application réelle.

Il y a certains pièges dans lesquels vous pouvez tomber en faisant cette comparaison avec des processeurs à 2 ou 4 cœurs:

  • Le nombre de threads simultanés ne correspond pas au nombre de threads exécutés en parallèle. Bien sûr, vous pouvez lancer 24576 threads simultanément sur GTX 580, mais la valeur optimale est dans la plupart des cas inférieure.

  • Un processeur à 2 ou 4 cœurs peut avoir plusieurs threads concurrents! De même que pour les processeurs graphiques, il est impossible d’append des threads à un moment donné, ou même de ralentir.

  • Un “cœur CUDA” est une unité de traitement scalaire unique, tandis que le cœur du processeur est généralement plus volumineux, contenant par exemple une unité SIMD à 4 largeurs. Pour comparer des pommes à des pommes, vous devez multiplier par 4 le nombre de cœurs de processeur annoncés pour correspondre à ce que NVIDIA appelle un cœur.

  • Le processeur prend en charge l’hyperthreading, ce qui permet à un seul cœur de traiter 2 threads simultanément de manière légère. À cause de cela, un système d’exploitation peut effectivement voir 2 fois plus de “cœurs logiques” que les cœurs matériels.

Pour résumer: Pour une comparaison équitable, votre processeur 4-core peut réellement exécuter 32 “threads scalaires” simultanément, à cause de SIMD et d’hyperthreading.

Je me rends compte que c’est un peu tard mais j’ai pensé que j’aiderais quand même. À partir de la page 10 du livre blanc sur l’architecture CUDA Fermi :

Chaque SM dispose de deux ordonnanceurs de chaîne et de deux unités de dissortingbution d’instructions, permettant d’émettre et d’exécuter simultanément deux chaînes.

Pour moi, cela signifie que chaque SM peut avoir 2 * 32 = 64 threads exécutés simultanément. Je ne sais pas si cela signifie que le GPU peut avoir un total de 16 * 64 = 1024 threads s’exécutant simultanément.