Причины CL_INVALID_WORK_GROUP_SIZE

#opencl

#opencl

Вопрос:

когда я меняю размер рабочей группы с 16 на 32 или что-то большее, я получаю CL_INVALID_WORK_GROUP_SIZE ошибку. matrix_size есть 64 .

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

Сначала я проверил документацию для clEnqueueNDRangeKernel, в которой указаны четыре (пять) разных причины CL_INVALID_WORK_GROUP_SIZE , но я думаю, что ни одна из них не применима. Пожалуйста, проверьте мои выводы. (Я надеюсь, вы не возражаете против моего стиля контроля качества)


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

A 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.

A Насколько я понял, справкой я не пользовался __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.

Я запросил clGetDeviceInfo и CL_DEVICE_MAX_WORK_GROUP_SIZE это 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.

это не local_work_size A 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].

A 32 < 512


Надеюсь, я ничего не упустил из виду. Пожалуйста, сообщите мне, когда у вас появится идея, что могло вызвать CL_INVALID_WORK_GROUP_SIZE или вы обнаружите ошибку в моих выводах.

Спасибо, что нашли время прочитать все это 🙂

Комментарии:

1. Этот вопрос старый, но я просто хочу поблагодарить вас за это очень четкое объяснение, потому что благодаря ему я только что нашел решение своей проблемы!

2. @BigBourin. Всегда пожалуйста. Пожалуйста, также 1 Quantumboredom за ответ, если вы еще этого не сделали.

Ответ №1:

CL_DEVICE_MAX_WORK_GROUP_SIZE должно возвращать единственное size_t значение (например, 512, но я не знаю, каким оно будет в вашей системе). Это максимальное количество рабочих элементов в рабочей группе, а не максимальное в каждом измерении. Итак, в вашем случае вы пытаетесь создать 2D рабочую группу с 32 * 32 = 1024 рабочими элементами, и, предположительно, CL_DEVICE_MAX_WORK_GROUP_SIZE в вашей системе их меньше 1024.

Смотрите спецификацию OpenCL 1.1, таблицу 4.3, стр. 37, определение CL_DEVICE_MAX_WORK_GROUP_SIZE :

Максимальное количество рабочих элементов в рабочей группе, выполняющей ядро с использованием модели параллельного выполнения данных.

Комментарии:

1. Большое вам спасибо. Я действительно использовал ту же переменную для чтения CL_DEVICE_MAX_WORK_ITEM_SIZES и CL_DEVICE_MAX_WORK_GROUP_SIZE без очистки. Как это часто бывает, ошибка гораздо более приземленная…

2. Для справки, спецификация OpenCL 1.1 khronos.org/registry/OpenCL/specs/opencl-1.1.pdf

Ответ №2:

У меня была такая же проблема, когда я пытался запустить свое ядро на CPU. Я не смог установить размер рабочей группы больше 128, в то время как CL_DEVICE_MAX_WORK_GROUP_SIZE возвращалось 1024.
После небольшого поиска, чтобы выяснить, откуда берется 128, оказалось, что он CL_KERNEL_WORK_GROUP_SIZE выдает правильное значение.