Question

J'ai besoin des éclaircissements. Je développe OpenCL sur mon ordinateur portable en cours d'exécution d'un petit GPU nvidia (310M). Quand j'interroger le périphérique pour CL_DEVICE_MAX_COMPUTE_UNITS, le résultat est 2. Je lis le nombre de groupes de travail pour l'exécution d'un noyau doit correspondre au nombre d'unités de calcul ( hétérogène Computing avec OpenCL , chapitre 9, p. 186), sinon il serait perdre trop bandwitdh mémoire globale.

Aussi la puce est déterminée pour avoir 16 noyaux de cuda (qui correspondent à EP je crois). Est-ce que cela signifie théoriquement le plus pour cette configuration performante gpu, en ce qui concerne la mémoire globale de la bande passante, est d'avoir deux groupes de travail avec 16 éléments de travail chacun?

Était-ce utile?

La solution

Lors de la définition du nombre de groupes de travail égale à CL_DEVICE_MAX_COMPUTE_UNITS pourrait être judicieux conseils sur certains matériels, il a certainement est pas sur GPU NVIDIA.

Sur l'architecture CUDA, une unité de calcul OpenCL est l'équivalent d'un multiprocesseur (qui peut avoir soit 8, 32 ou 48 noyaux), et ceux-ci sont conçus pour être en mesure de simultanesouly fonctionner jusqu'à 8 groupes de travail (blocs CUDA ) chaque . A de plus grandes tailles de données d'entrée, vous pouvez choisir d'exécuter des milliers de groupes de travail, et votre GPU particulier peut gérer jusqu'à 65535 x 65535 groupes de travail par lancement du noyau.

OpenCL a un autre CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE d'attribut de dispositif. Si vous interrogez que sur un périphérique NVIDIA, il retournera 32 (ce qui est la « chaîne », ou la largeur de SIMD naturelle du matériel). Cette valeur est la taille du groupe de travail multiples, vous devez utiliser; la taille des groupes de travail peuvent être jusqu'à 512 points chacun, en fonction des ressources consommées par chaque élément de travail. La règle standard de base pour votre GPU particulier est que vous avez besoin d'au moins 192 éléments de travail actifs par unité de calcul (fils par multiprocesseur en termes CUDA) pour couvrir tous les temps d'attente de l'architecture et d'obtenir potentiellement soit une bande passante complète de la mémoire ou le débit arithmétique complète, en fonction sur la nature de votre code.

NVIDIA expédier un bon document intitulé "Guide de programmation OpenCL pour l'architecture CUDA" dans la boîte à outils CUDA. Vous devriez prendre un certain temps de le lire, car il contient tous les détails de la façon dont la mise en œuvre NVIDIA OpenCL cartes sur les caractéristiques de leur matériel, et il répondra aux questions que vous avez soulevées ici.

Autres conseils

Je ne pense même pas correspondant à votre nombre de groupes de travail à des unités de calcul est une bonne idée sur un CPU. Il est préférable de surévaluer les noyaux par plusieurs fois. Cela permet à la charge de travail de se déplacer dynamiquement autour (en quanta de groupe de travail) que divers processeurs viennent en ligne ou se laisser distraire avec d'autres travaux. Groupe de travail count = CL_DEVICE_MAX_COMPUTE_UNITS ne fonctionne vraiment bien sur une machine qui ne fait absolument rien d'autre et de gaspiller beaucoup d'énergie en gardant les âmes inutilisées se réveillent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top