Questions sur la taille du travail mondial et local

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?

Message du forum original

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.

  1. Le global_work_size doit- global_work_size être plus petit que CL_DEVICE_MAX_WORK_ITEM_SIZES ? Sur ma machine CL_DEVICE_MAX_WORK_ITEM_SIZES = 512, 512, 64.

  2. Est-ce que CL_KERNEL_WORK_GROUP_SIZE est le CL_KERNEL_WORK_GROUP_SIZE recommandé pour le kernel utilisé?

    1. Ou est-ce le seul work_group_size le GPU permet? Sur ma machine CL_KERNEL_WORK_GROUP_SIZE = 512
  3. Dois-je diviser en groupes de travail ou puis-je n’en avoir qu’un seul, sans spécifier local_work_size ?

    1. A quoi dois-je faire attention quand je n’ai qu’un groupe de travail?
  4. Que signifie CL_DEVICE_MAX_WORK_GROUP_SIZE ? Sur ma machine CL_DEVICE_MAX_WORK_GROUP_SIZE = 512, 512, 64

    1. Cela signifie-t-il que je peux avoir un groupe de travail aussi grand que CL_DEVICE_MAX_WORK_ITEM_SIZES ?
  5. global_work_size est-il un diviseur de CL_DEVICE_MAX_WORK_ITEM_SIZES ? Dans mon code global_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).