CUDA Bloc et de la taille de la Grille de l'efficience
Qu'est-ce que le conseillé manière de gérer dynamiquement la taille d'ensembles de données dans cuda?
Est-il d'un cas de "définir le bloc et les tailles de grille basée sur l'ensemble de problèmes" ou est-il plus intéressant d'attribuer bloc de dimensions comme des facteurs de 2 et certains ont dans le noyau de la logique de traiter avec le plus de déversement?
Je peux voir comment cela probablement beaucoup de questions pour le bloc de dimensions, mais combien cette question à la grille de dimensions? Si je comprends bien, le matériel réel des contraintes de s'arrêter au niveau du bloc (j'.e blocs affecté à la SM qui ont un certain nombre de SP, et peut donc traiter une courbure particulière de la taille).
J'ai pris connaissance de Kirk de la Programmation des Processeurs Massivement Parallèles", mais il n'a pas vraiment de pression sur cette zone.
Vous devez vous connecter pour publier un commentaire.
Il est habituellement une affaire de réglage de la taille de bloc pour des performances optimales, et de la taille de la grille en fonction du montant total des travaux. La plupart des noyaux ont un "sweet spot" nombre de fils de chaîne par Mp où ils fonctionnent le mieux, et vous devriez faire un peu de benchmarking/profilage pour voir où c'est. Vous avez probablement encore besoin de plus de déversement de logique dans le noyau à cause des tailles de problème sont rarement ronde multiples de tailles de bloc.
EDIT:
Pour donner un exemple concret de la façon dont cela pourrait être fait par un simple noyau (dans ce cas, une coutume BLAS de niveau 1 dscal type d'opération effectuée dans le cadre d'une factorisation de Cholesky de paniers symétrique de la bande de matrices):
Pour le lancement de ce noyau, les paramètres d'exécution sont calculés comme suit:
Le wrapper qui en résulte fonction contenant le paramètre d'exécution des calculs et de noyau de lancement ressembler à ceci:
Peut-être ce qui donne quelques conseils sur la façon de concevoir un "universel" pour le réglage de paramètres d'exécution contre la taille des données d'entrée.
max()
ici:max(1, min(4, warpCount))
?Ok je suppose que nous avons affaire à deux questions ici.
1) une Bonne façon d'assigner les tailles de bloc (c'est à dire le nombre de threads)
Cela dépend généralement de la nature des données que vous avez à faire. Faites-vous affaire avec les vecteurs ? Faites-vous affaire avec des matrices ? L'approche proposée est de maintenir le nombre de threads par multiples de 32. Quand on parle de vecteurs, le lancement de 256 x 1, 512 x 1 blocs peuvent être belles. Et similariy lorsque vous traitez avec des matrices, 32 x 8, 32 x 16.
2) une Bonne façon d'assigner les tailles de grille (c'est à dire le nombre de blocs)
Cela devient un peu compliqué ici. Juste le lancement de 10 000 blocs, parce que nous pouvons normalement n'est pas la meilleure façon de faire les choses. La commutation de blocs dans et hors de matériel est coûteux. Deux choses à prendre en compte sont la mémoire partagée utilisée par bloc, et le nombre total de SPs disponibles, et de résoudre pour le nombre optimal.
Vous pouvez trouver une vraiment bonne mise en œuvre de la façon de le faire à partir de poussée. Il peut prendre un certain temps à comprendre ce qui se passe à l'intérieur du code si.
Je pense qu'il est généralement préférable de régler le bloc et les tailles de grille en fonction du problème, surtout pour des raisons d'optimisation. Ayant des threads qui ne font rien, ne fait pas de sens et peut aggraver les performances de vos programmes.
Si vous avez dynamiquement la taille des ensembles de données, alors vous aurez probablement rencontrer quelques problèmes avec la latence alors que certains threads et les blocs d'attendre des autres.
Ce site a quelques grands heuristiques. Quelques faits saillants:
Choix De Blocs Par Grille
__syncthreads()
dans vos noyaux, le plus de blocs (de sorte qu'un bloc peut s'exécuter pendant que l'autre attend de synchronisation)Le Choix De Threads Par Bloc
Les Threads multiples de la courbure de la taille (c'est à dire généralement 32)
Généralement bon de choisir le nombre de threads tels que le nombre maximum de threads par bloc (selon le matériel) est un multiple du nombre de threads. E. g. avec max de threads de 768, à l'aide de 256 threads par bloc ont tendance à être de mieux que de 512 parce que plusieurs threads peuvent s'exécuter simultanément sur un bloc.