J'ai été en utilisant CUDA pour quelques semaines, mais j'ai quelques doutes au sujet de l'allocation de blocs/chaines/thread. J'étudie l'architecture à partir d'un point de vue didactique (projet universitaire), afin d'atteindre des performances de pointe n'est pas ma préoccupation.
Tout d'abord, je voudrais comprendre si je suis ces faits:
A. Le programmeur écrit un noyau, et d'organiser son exécution dans une grille de thread se bloque.
B. Chaque bloc est assigné à une Streaming Multiprocesseur (SM). Une fois attribué, il ne peut pas migrer vers un autre SM.
C. Chaque SM divise ses propres blocs dans les Croisements (actuellement avec une taille maximale de 32 threads). Tous les threads d'un warp exécute simultanément sur les ressources de la SM.
D. L'exécution d'un thread est exécuté par le CUDA Cores contenues dans le SM. Il n'y a aucune correspondance entre les threads et les cœurs.
E. Si une chaine contient 20 thread, mais actuellement il y a seulement 16 cœurs disponibles, la chaîne ne sera pas exécuté.
F. d'autre part, si un bloc contient 48 threads, il sera divisé en 2 chaînes et elles s'exécutent en parallèle à condition que la mémoire disponible est suffisante.
G. Si un thread démarre sur un tronc, puis il est bloqué pour l'accès à la mémoire ou pour une longue opération de virgule flottante, son exécution pourrait reprendre sur une autre base.
Sont-ils corrects?
Maintenant, j'ai une GeForce 560 Ti ainsi, selon les spécifications qu'il est équipé de 8 cm, contenant chacune des 48 CUDA cores (384 cœurs au total).
Mon but est de faire en sorte que chaque de base de l'architecture exécute les MÊMES instructions. En supposant que mon code ne nécessite pas de s'inscrire que ceux disponibles dans chaque SM, j'ai imaginé des approches différentes:
J'ai créer 8 blocs de 48 fils de chaque, de sorte que chaque SM a 1 bloc à exécuter. Dans ce cas, l'48 threads exécutent en parallèle dans le SM (en exploiter toutes les 48 cœurs disponibles pour eux)?
Quelle est la différence si je me lance 64 blocs de 6 fils? (En supposant qu'ils seront cartographiés de manière uniforme entre les SMs)
Si je "immerger" le CPU avec le travail (création de 1024 blocs de 1024 thread, par exemple) est-il raisonnable de supposer que tous les coeurs dans l'architecture sera utilisé à un certain point, et d'effectuer les mêmes calculs (en supposant que les fils ne jamais décrochage)?
Est-il possible de vérifier ces situations à l'aide du générateur de profils?
Est-il une référence pour ce genre de choses? J'ai lu le guide de Programmation CUDA et les chapitres consacrés à l'architecture matérielle dans "la Programmation des Processeurs Massivement Parallèles" et "CUDA la conception de l'Application et du développement"; mais je ne pouvais pas obtenir une réponse précise.
Je vous remercie pour votre temps.