J'ai une GeForce GTX 580 et je souhaite indiquer le nombre total de threads pouvant (idéalement) être exécutés en parallèle, à comparer avec 2 ou 4 processeurs multicœurs.
deviceQuery me donne les informations potentiellement pertinentes suivantes:
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 dire que chaque noyau CUDA peut exécuter une chaîne en parallèle et qu'une chaîne est composée 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 suis-je loin et les cœurs CUDA ne fonctionnent pas vraiment en parallèle?
La GTX 580 peut avoir 16 * 48 chaînes simultanées (32 threads chacune) exécutées à la fois. Soit 16 multiprocesseurs (SM) * 48 chaînes résidentes par SM * 32 threads par chaîne = 24 576 threads.
Ne confondez pas concurrence et débit. Le nombre ci-dessus est le nombre maximal de threads dont les ressources peuvent être stockées simultanément sur la puce - le nombre qui peut être résident . En termes CUDA, nous appelons aussi cette occupation maximale occupation . Le matériel bascule constamment entre les warp afin de couvrir ou de "masquer" la (grande) latence des accès mémoire ainsi que la (petite) latence des pipelines arithmétiques.
Chaque SM peut avoir 48 warps résidents, mais il ne peut émettre d'instructions que d'un petit nombre (en moyenne entre 1 et 2 pour la GTX 580, mais cela dépend de la combinaison d'instructions de programme) de warps à chaque cycle d'horloge.
Il est donc probablement préférable de comparer le débit, qui dépend des unités d’exécution disponibles et de la capacité du matériel à exécuter plusieurs problèmes. Sur la GTX580, il existe 512 unités d’exécution FMA, mais également des unités entières, des unités de fonction spéciales, des unités d’instruction de mémoire, etc., qui peuvent être émises en double pour (c’est-à-dire émettre des instructions indépendantes de 2 chaînes simultanément) dans diverses combinaisons.
Tenir compte de tout ce qui précède est cependant trop difficile, aussi la plupart des gens comparent-ils sur deux métriques:
La comparaison la plus importante est toujours le temps chronométré sur une application réelle.
Vous pouvez tomber dans certains pièges 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 entendu, vous pouvez lancer simultanément 24576 threads sur la GTX 580, mais la valeur optimale est dans la plupart des cas inférieure.
Un processeur à 2 ou 4 cœurs peut avoir un nombre arbitraire de threads simultanés! De la même manière que pour le GPU, ajouter un certain nombre de threads n’aidera pas à un moment donné, voire ralentira.
Un "cœur CUDA" est une unité de traitement scalaire unique, alors que le cœur de la CPU est généralement un élément plus volumineux, contenant par exemple une unité SIMD à 4 bandes. Pour comparer des pommes avec 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 deux threads simultanément de manière légère. De ce fait, un système d'exploitation peut en réalité voir 2 fois plus de "cœurs logiques" que les cœurs matériels.
Pour résumer: Pour une comparaison juste, votre CPU à 4 cœurs peut en réalité exécuter 32 "threads scalaires" simultanément, en raison de SIMD et de l'hyperthreading.
Je me rends compte que c'est un peu tard, mais je me suis dit que j'aiderais quand même. Extrait de la page 10 du livre blanc CUDA Fermi architecture:
Chaque SM comporte deux ordonnanceurs de chaîne et deux unités d'envoi d'instructions, permettant à deux chaînes d'être émises et exécutées simultanément.
Pour moi, cela signifie que chaque SM peut avoir 2 * 32 = 64 threads s'exécutant simultanément. Je ne sais pas si cela signifie que le processeur graphique peut avoir un total de 16 * 64 = 1024 threads s'exécutant simultanément.