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:)
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.
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.