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.
-
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).
-
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.
-
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.