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).