#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
выдает правильное значение.