Causes de la taille du groupe de travail CL invalide

Lorsque je change la taille du groupe de travail de 16 à 32 ou quelque chose de plus grand, j'obtiens une erreur CL_INVALID_WORK_GROUP_SIZE. matrix_size est 64.

  localWorkSize[0] = groupsize;
  localWorkSize[1] = localWorkSize[0];
  globalWorkSize[0] = matrix_size;
  globalWorkSize[1] = globalWorkSize[0];

J'ai d'abord vérifié la documentation de clEnqueueNDRangeKernel qui énonce quatre (cinq) causes différentes CL_INVALID_WORK_GROUP_SIZE, mais je pense que non d'entre elles s'appliquent. Veuillez vérifier mes conclusions. (J'espère que cela ne vous dérange pas mon style QA)


Q CL_INVALID_WORK_GROUP_SIZE if local_work_size is specified and number of work-items specified by global_work_size is not evenly divisable by size of work-group given by local_work_size

Un 64 % 32 = 0

Q or does not match the work-group size specified for kernel using the __attribute__((reqd_work_group_size(X, Y, Z))) qualifier in program source.

Un ce Que j'ai compris de l'aide, je n'ai pas utiliser __attribute__.

Q CL_INVALID_WORK_GROUP_SIZE if local_work_size is specified and the total number of work-items in the work-group computed as local_work_size[0] *... local_work_size[work_dim - 1] is greater than the value specified by CL_DEVICE_MAX_WORK_GROUP_SIZE in the table of OpenCL Device Queries for clGetDeviceInfo.

Un j'ai interrogé clGetDeviceInfo et CL_DEVICE_MAX_WORK_GROUP_SIZE est 512, 512, 64

Q CL_INVALID_WORK_GROUP_SIZE if local_work_size is NULL and the __attribute__((reqd_work_group_size(X, Y, Z))) qualifier is used to declare the work-group size for kernel in the program source.

Un local_work_size n'est pas NULL.

Q CL_INVALID_WORK_ITEM_SIZE if the number of work-items specified in any of local_work_size[0], ... local_work_size[work_dim - 1] is greater than the corresponding values specified by CL_DEVICE_MAX_WORK_ITEM_SIZES[0], .... CL_DEVICE_MAX_WORK_ITEM_SIZES[work_dim - 1].

Un 32


J'espère que je n'ai pas oublié quelque chose. Dites-moi, quand vous avez une idée de ce qui pourrait causer la CL_INVALID_WORK_GROUP_SIZE ou trouvé une erreur dans mes conclusions.

Merci d'avoir pris le temps de lire tout cela:)

27
demandé sur Framester 2011-04-05 23:11:15

2 réponses

CL_DEVICE_MAX_WORK_GROUP_SIZE devrait renvoyer une seule valeur size_t (par exemple 512, mais je ne sais pas ce que ce serait sur votre système). C'est le nombre maximum d'éléments de travail dans un groupe de travail, pas le maximum dans chaque dimension. Donc, dans votre cas, vous essayez de créer un groupe de travail 2D avec 32 * 32 = 1024 éléments de travail, et probablement CL_DEVICE_MAX_WORK_GROUP_SIZE est inférieur à 1024 sur votre système.

Voir la spécification OpenCL 1.1, tableau 4.3, page 37, La définition de CL_DEVICE_MAX_WORK_GROUP_SIZE:

Nombre maximal d'éléments de travail dans un groupe de travail exécuter un noyau en utilisant le modèle d'exécution parallèle de données.

17
répondu Quantumboredom 2012-09-15 16:30:17

J'ai eu le même problème quand j'essayais d'exécuter mon noyau sur CPU. Je ne pouvais pas définir la taille du groupe de travail de plus de 128, alors que CL_DEVICE_MAX_WORK_GROUP_SIZE renvoyait 1024.
Après un peu de recherche pour savoir d'où vient 128, il s'est avéré que CL_KERNEL_WORK_GROUP_SIZE donnait la valeur appropriée.

0
répondu Rsh 2016-11-23 15:24:33