2 votes

Dans OpenCL, comment la mémoire __locale peut-elle être plus rapide lorsque la taille des groupes de travail ne fait pas partie de l'architecture ?

Je m'excuse pour ma naïveté si cette question est stupide, je suis nouveau dans la programmation GPGPU.

Ma question est la suivante : puisque l'architecture du dispositif ne peut pas changer, comment se fait-il que la mémoire __locale puisse être optimisée pour être accessible uniquement par les éléments du groupe de travail local, alors que c'est l'utilisateur qui choisit la taille du groupe de travail (sous réserve de divisibilité) ?

4voto

pmdj Points 5911

La mémoire locale est généralement attachée à un certain groupe d'unités d'exécution dans le matériel GPU. La taille du groupe d'exécution est effectivement choisie par l'application cliente, mais l'implémentation OpenCL imposera une limite. Votre application doit l'interroger via clGetKernelWorkGroupInfo() en utilisant le CL_KERNEL_WORK_GROUP_SIZE nom du paramètre.

Il y a une certaine flexibilité dans la taille des groupes de travail parce que la plupart des GPU sont conçus de manière à ce que plusieurs fils d'exécution puissent être programmés pour fonctionner sur une seule unité d'exécution. (Une forme de SMT .) Notez également que les threads planifiés n'ont pas besoin d'être dans le même groupe de travail, donc si par exemple un GPU a 64 processeurs dans un cluster, et supporte le SMT à 4 voies sur chaque processeur, ces 256 threads pourraient provenir de 1, 2, ou 4, ou peut-être même 8 ou 16 groupes de travail, selon le matériel et les capacités du compilateur.

Les processeurs de certains GPU utilisent également des registres et des instructions vectoriels en interne, de sorte que les threads ne correspondent pas 1:1 aux éléments de travail OpenCL. Un processeur peut par exemple traiter 4 éléments de travail à la fois.

En fin de compte, cependant, un groupe de travail doit tenir sur le cluster de processeurs qui est attaché à un morceau de mémoire locale ; ainsi, la taille de la mémoire locale et le nombre maximum de threads qui peuvent être programmés sur un cluster influencent la taille maximale du groupe de travail.

En général, essayez de minimiser la quantité de mémoire locale utilisée par votre groupe de travail afin que l'implémentation OpenCL ait le maximum de flexibilité pour programmer les groupes de travail. (Mais n'hésitez pas à utiliser la mémoire locale lorsque cela améliore les performances ! Il suffit d'en utiliser le moins possible).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X