Подтвердить что ты не робот

Причины для CL_INVALID_WORK_GROUP_SIZE

когда я изменяю размер рабочей группы от 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, но я думаю, что они не применяются, Пожалуйста, проверьте мои выводы. (Надеюсь, вы не против моего стиля 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

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.

A Я запросил 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.

A local_work_size не 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 или найти ошибку в моих выводах.

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

4b9b3361

Ответ 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:

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

Ответ 2

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