En général, vous pouvez choisir global_work_size aussi grand que vous voulez, tout en local_work_size est contrainte par le périphérique sous-jacent et le matériel, de sorte que tous les résultats de la requête vais vous dire les dimensions possibles pour local_work_size au lieu de la global_work_size. la seule contrainte pour le global_work_size est qu'il doit être un multiple de la local_work_size (pour chaque dimension).
Le groupe de travail des tailles de spécifier les tailles des groupes de travail afin de s' CL_DEVICE_MAX_WORK_ITEM_SIZES
est 512, 512, 64
ce qui signifie que signifie que votre local_work_size ne peut pas être supérieure à 512
x et y de dimension et d' 64
pour le z de dimension.
Cependant, il est également une contrainte sur le groupe local de la taille en fonction du noyau. Ceci est exprimé par le biais CL_KERNEL_WORK_GROUP_SIZE
. Votre cumulatif workgoupsize (comme dans le produit de toutes les dimensions, par exemple, 256
si vous avez un localsize d' 16, 16, 1
) ne doit pas être supérieure à ce nombre. C'est en raison du peu de ressources matérielles à être divisée entre les filets (à partir de résultats de la requête je suppose que vous êtes de programmation sur gpu nvidia, de sorte que le montant de la mémoire locale et les registres utilisés par un thread va limiter le nombre de threads qui peuvent être exécutées 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 qu' CL_KERNEL_WORK_GROUP_SIZE
, mais spécifique à l'appareil à la place du noyau (et il devrait être une valeur scalaire aka 512
).
Vous pouvez choisir de ne pas spécifier local_work_group_size, auquel cas la prise en charge d'opencl mise en œuvre permettra de choisir un groupe de travail local taille pour vous (si ce n'est pas une garantie qu'il n'utilise qu'un seul groupe de travail). Cependant, il n'est généralement pas advisiable, car vous ne savez pas comment votre travail est divisé en groupes de travail et de plus, il n'est pas garanti que le workgroupsize choisi sera optimal.
Cependant vous devriez noter que l'utilisation d'un seul groupe de travail est généralement pas une bonne idée performancewise (et pourquoi utiliser opencl si la performance n'est pas un souci). En général, un groupe de travail doit s'exécuter sur une unité de calcul, alors que la plupart des appareils ont plus d'un (les Processeurs modernes ont 2 ou plus, une pour chaque noyau, tandis que les Processeurs modernes peuvent avoir jusqu'à 20). En outre, même une Unité de Calcul sur lequel votre groupe de travail s'exécute peut ne pas être entièrement utilisé, depuis plusieurs groupe de travail peuvent s'exécuter sur une unité de calcul dans un style SMT. Pour utiliser le Gpu NVIDIA de façon optimale, vous devez 768/1024/1536 threads (selon la génération, le sens G80/GT200/GF100) exécution sur une unité de calcul, et alors que je ne connais pas les chiffres pour les processeurs amd droit maintenant, ils sont dans le même ordre de grandeur, il est donc bon d'avoir plus d'un groupe de travail. Furhermore pour le gpu il est généralement conseillé d'avoir des groupes de travail, dont au moins 64 threads (et un nombre de threads divisible par 32/64 (nvidia/amd) par groupe de travail), parce que sinon, vous allez de nouveau avoir des performances réduites (32/64 est le minimum granuaty pour l'exécution sur gpu, donc si vous avez moins d'items dans un groupe de travail, il sera toujours exécuter en tant que 32/64 threads, mais ignorer les résultats de inutilisés threads).