En parcourant les forums NVIDIA, j'ai trouvé ces questions , qui m'intéressent également, mais personne n'y avait répondu au cours des quatre derniers jours environ. Pouvez-vous m'aider?
En creusant dans les tutoriels de lecture d'OpenCL, certaines choses ne sont pas claires pour moi. Voici une collection de mes questions concernant les tailles de travail locales et mondiales.
Le
global_work_size
être plus petit queCL_DEVICE_MAX_WORK_ITEM_SIZES
? Sur ma machineCL_DEVICE_MAX_WORK_ITEM_SIZES
= 512, 512, 64.Est
CL_KERNEL_WORK_GROUP_SIZE
le recommandéwork_group_size
pour le noyau utilisé?
- Ou est-ce le seul
work_group_size
le GPU le permet? Sur ma machineCL_KERNEL_WORK_GROUP_SIZE
= 512Dois-je me diviser en groupes de travail ou puis-je en avoir un seul, mais sans spécifier
local_work_size
?
- À quoi dois-je faire attention, quand je n'ai qu'un seul groupe de travail?
Qu'est-ce que
CL_DEVICE_MAX_WORK_GROUP_SIZE
signifier? Sur ma machineCL_DEVICE_MAX_WORK_GROUP_SIZE
= 512, 512, 64
- Est-ce à dire que je peux avoir un groupe de travail qui est aussi grand que le
CL_DEVICE_MAX_WORK_ITEM_SIZES
?A
global_work_size
être 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, tandis que local_work_size est contraint par le périphérique/matériel sous-jacent, de sorte que tous les résultats de la requête vous indiqueront les dimensions possibles pour local_work_size au lieu de global_work_size. la seule contrainte pour global_work_size est qu'il doit s'agir d'un multiple de local_work_size (pour chaque dimension).
Les tailles des groupes de travail spécifient les tailles des groupes de travail, donc si CL_DEVICE_MAX_WORK_ITEM_SIZES
est 512, 512, 64
cela signifie que votre taille_travail_local ne peut pas être plus grande que 512
pour les dimensions x et y et 64
pour la dimension z.
Cependant, il existe également une contrainte sur la taille du groupe local en fonction du noyau. Cela s'exprime par CL_KERNEL_WORK_GROUP_SIZE
. Votre taille de groupe de travail cumulée (comme dans le produit de toutes les dimensions, par exemple 256
si vous avez une taille locale de 16, 16, 1
) ne doit pas être supérieur à ce nombre. Cela est dû aux ressources matérielles limitées à répartir entre les threads (à partir des résultats de votre requête, je suppose que vous programmez sur un GPU NVIDIA, donc la quantité de mémoire locale et de registres utilisée par un thread limitera le nombre de threads qui peuvent être exécutés 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 à l'appareil à la place du noyau (et ce devrait être une valeur scalaire aka 512
).
Vous pouvez choisir de ne pas spécifier local_work_group_size, auquel cas l'implémentation OpenCL choisira une taille de groupe de travail local pour vous (donc ce n'est pas une garantie qu'elle n'utilise qu'un seul groupe de travail). Cependant, il 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, vous devez noter que l'utilisation d'un seul groupe de travail n'est généralement pas une bonne idée en termes de performances (et pourquoi utiliser OpenCL si les performances ne sont pas un problème). En général, un groupe de travail doit s'exécuter sur une unité de calcul, tandis que la plupart des appareils en auront plus d'un (les processeurs modernes en ont 2 ou plus, un pour chaque cœur, tandis que les GPU modernes peuvent en avoir 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 seule unité de calcul dans un style SMT. Pour utiliser les GPU NVIDIA de manière optimale, vous avez besoin de 768/1024/1536 threads (selon la génération, c'est-à-dire G80/GT200/GF100) s'exécutant sur une seule unité de calcul, et bien que je ne connaisse pas les chiffres pour AMD en ce moment, ils sont dans le 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 qui au moins 64 threads (et un certain nombre de threads divisibles par 32/64 (nvidia/AMD) par groupe de travail), car sinon vous aurez à nouveau des performances réduites (32/64 est le 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 rejetera les résultats des threads inutilisés).