2010-07-12 4 views
1

En supposant qu'un bloc a une limite de 512 threads, disons que mon noyau a besoin de plus de 512 threads pour l'exécution, comment doit-on concevoir la hiérarchie des threads pour des performances optimales? (cas 1)Conception de hiérarchies de threads dans le noyau dans CUDA

1er bloc - 512 fils bloc 2e - fils restants

(cas 2) distribuer le même nombre de fils à travers certains blocs.

+0

Si un noyau a besoin de 600 threads, la meilleure option consistera à allouer 300 threads dans 2 blocs. ou existe-t-il une option pour utiliser les 512 threads du 1er bloc et rester dans le 2ème bloc? –

+0

Je pense que cela dépend du problème que vous essayez de résoudre. Pourriez-vous être un peu plus précis? – KLee1

+0

aussi si mon noyau a besoin de 601 threads ou d'un nombre impair en tant que tel, comment devrait-on allouer les blocs? –

Répondre

1

Je ne pense pas que cela importe vraiment, mais il est plus important de regrouper les blocs de fil logiquement, de sorte que vous êtes en mesure d'utiliser d'autres optimisations CUDA (comme la mémoire coalescent)

This link fournit un aperçu comment CUDA va (probablement) et organiser vos discussions.

Une citation du résumé:

Pour résumer, les paramètres spéciaux à un lancement du noyau définissent les dimensions de une grille et ses blocs. Les coordonnées uniques dans les variables blockId et threadId permettent de distinguer entre les threads d'une grille à . Il est de la responsabilité du programmeur d'utiliser ces variables dans les fonctions du noyau afin que les threads puissent identifier correctement la partie des données à traiter. Ces variables obligent les programmeurs à organiser les threads et les données dans organisations hiérarchiques et multidimensionnelles .

0

Il est préférable de diviser également les threads en deux blocs, afin de maximiser le chevauchement calcul/accès mémoire. Quand vous avez par exemple 256 threads dans un bloc, ils ne calculent pas tous en même temps, il y a des tâches sur le SM par chaîne de 32 threads. Lorsqu'un Warp attend des données de mémoire globales, un autre Warp est planifié. Si vous avez un petit bloc de threads, vos accès mémoire globaux sont beaucoup plus pénalisants.

En outre, dans votre exemple vous sous-utilisez votre GPU. Rappelez-vous juste qu'un GPU a des douzaines de multiprocesseurs (par exemple 30 pour le Tesla C1060), et un bloc est mappé à un multiprocesseur. Dans votre cas, vous n'utiliserez que 2 multiprocesseurs.

Questions connexes