En parcourant les forums de NVIDIA, j’ai trouvé ces questions , qui m’intéressaient également, mais personne ne leur avait répondu ces quatre derniers jours. Pouvez-vous aider?
En fouillant dans les tutoriels de lecture OpenCL, certaines choses sont restées floues pour moi. Voici un recueil de mes questions concernant les tailles de travail locales et globales.
- Débogueur pour OpenCL
- OpenGL vs. OpenCL, à choisir et pourquoi?
- Pourquoi Google a-t-il choisi RenderScript au lieu d'OpenCL
- Performances AbSmal OpenCL ImageSampling vs OpenGL TextureSampling
- Quelle est la différence entre OpenCL et OpenGL?
Le
global_work_size
doit-global_work_size
être plus petit queCL_DEVICE_MAX_WORK_ITEM_SIZES
? Sur ma machineCL_DEVICE_MAX_WORK_ITEM_SIZES
= 512, 512, 64.Est-ce que
CL_KERNEL_WORK_GROUP_SIZE
est leCL_KERNEL_WORK_GROUP_SIZE
recommandé pour le kernel utilisé?
- Ou est-ce le seul
work_group_size
le GPU permet? Sur ma machineCL_KERNEL_WORK_GROUP_SIZE
= 512Dois-je diviser en groupes de travail ou puis-je n’en avoir qu’un seul, sans spécifier
local_work_size
?
- A quoi dois-je faire attention quand je n’ai qu’un groupe de travail?
Que signifie
CL_DEVICE_MAX_WORK_GROUP_SIZE
? Sur ma machineCL_DEVICE_MAX_WORK_GROUP_SIZE
= 512, 512, 64
- Cela signifie-t-il que je peux avoir un groupe de travail aussi grand que
CL_DEVICE_MAX_WORK_ITEM_SIZES
?
global_work_size
est-il un diviseur deCL_DEVICE_MAX_WORK_ITEM_SIZES
? Dans mon codeglobal_work_size
= 20.
En général, vous pouvez choisir global_work_size aussi grand que vous le souhaitez, alors que local_work_size est une contrainte par le périphérique / matériel sous-jacent, donc tous les résultats de requête vous indiqueront les dimensions possibles de local_work_size au lieu de global_work_size. La seule contrainte pour la taille_de_travail global est qu’il doit s’agir d’un multiple de la taille_travail_ local (pour chaque dimension).
Les tailles des groupes de travail spécifient la taille des groupes de travail. Par conséquent, si CL_DEVICE_MAX_WORK_ITEM_SIZES
est 512, 512, 64
cela signifie que votre taille_s local_work ne peut pas être supérieure à 512
pour la dimension x et y et 64
à la dimension z.
Cependant, il existe également une contrainte sur la taille du groupe local en fonction du kernel. Ceci est exprimé par CL_KERNEL_WORK_GROUP_SIZE
. Votre taille de travail cumulée (comme dans le produit de toutes les dimensions, par exemple 256
si vous avez une taille de 16, 16, 1
) ne doit pas être supérieure à ce nombre. Cela est dû aux ressources matérielles limitées à répartir entre les threads (à partir de vos résultats de requête, je suppose que vous programmez sur un GPU NVIDIA, donc la quantité de mémoire locale et de registres utilisés par un thread limitera le nombre de threads pouvant être exécuté en parallèle).
CL_DEVICE_MAX_WORK_GROUP_SIZE
définit la taille maximale d’un groupe de travail de la même manière que CL_KERNEL_WORK_GROUP_SIZE
, mais spécifique au périphérique à la place du kernel (et il devrait s’agir d’une valeur scalaire 512
).
Vous pouvez choisir de ne pas spécifier local_work_group_size, auquel cas l’implémentation d’OpenCL choisira pour vous une taille de groupe de travail locale (elle ne garantit donc pas qu’elle utilise un seul groupe de travail). Cependant, ce n’est généralement pas conseillé, car vous ne savez pas comment votre travail est divisé en groupes de travail et en outre, il n’est pas garanti que la taille de groupe de travail choisie sera optimale.
Cependant, notez que l’utilisation d’un seul groupe de travail n’est généralement pas une bonne idée (et pourquoi utiliser OpenCL si les performances ne sont pas un problème). En général, un groupe de travail doit exécuter sur une unité de calcul, alors que la plupart des appareils en auront plus d’un (les processeurs modernes en ont deux ou plus, un pour chaque cœur, tandis que les GPU modernes en ont 20 ou plus). De plus, même l’unité de calcul sur laquelle votre groupe de travail s’exécute peut ne pas être entièrement utilisée, car plusieurs groupes de travail peuvent s’exécuter sur une unité de calcul dans un style SMT. Pour utiliser les GPU NVIDIA de manière optimale, vous devez utiliser des threads 768/1024/1536 (en fonction de la génération, c’est-à-dire G80 / GT200 / GF100) exécutés sur une unité de calcul et bien que je ne connaisse pas même ampleur, il est donc bon d’avoir plus d’un groupe de travail. De plus, pour les GPU, il est généralement conseillé d’avoir des groupes de travail contenant au moins 64 threads (et un nombre de threads divisible par 32/64 (nvidia / amd) par groupe de travail). granuaty minimum pour l’exécution sur gpus, donc si vous avez moins d’éléments dans un groupe de travail, il s’exécutera toujours en tant que threads 32/64, mais supprimera les résultats des threads inutilisés).