Это, кажется, старый пост, но позвольте мне обновить этот пост новой информацией. Надеюсь, это может помочь кому-то еще.
Должен ли глобальный размер работы (размеры) составлять несколько рабочих групп?
Размер (размеры) в OpenCL?
Ответ: верно до OpenCL 2.0. До CL2.0 ваш глобальный рабочий размер должен быть кратным локальному рабочему размеру, в противном случае вы получите сообщение об ошибке при выполнении clEnqueueNDRangeKernel.
Но с CL2.0 это больше не требуется. Вы можете использовать любой глобальный размер работы, который соответствует размерам вашего приложения. Однако, пожалуйста, помните, что аппаратная реализация все еще может использовать «старый» способ, который означает заполнение глобального размера рабочей группы. Следовательно, производительность сильно зависит от аппаратной архитектуры. Вы можете увидеть совершенно разную производительность на разных аппаратных средствах / платформах. Кроме того, вы хотите сделать ваше приложение обратно совместимым с поддержкой более старой платформы, которая поддерживает только CL до версии 1.2. Итак, я думаю, что эта новая функция, добавленная в CL2.0, предназначена только для простого программирования, для улучшения управляемости и обратной совместимости. Я предлагаю вам по-прежнему использовать следующий метод, упомянутый вами:
Увеличьте размеры глобальной работы до ближайшего кратного
измерений рабочей группы, сохраняя все входные и выходные буферы
то же самое, но проверка границ в ядре, чтобы избежать сегфагов, т.е.
ничего на рабочих элементах выходит за пределы желаемого результата. (Это
кажется, лучше.)
Ответ: вы абсолютно правы. Это правильный способ справиться с таким делом. Тщательно спроектируйте размер локальной рабочей группы (принимая во внимание такие факторы, как использование регистра, попадание в кэш, ошибка доступа к памяти и т. Д.). А затем добавьте ваш глобальный рабочий размер, кратный локальному рабочему размеру. Тогда тебе пора.
Еще одна вещь, которую следует учитывать, это то, что вы можете использовать объект изображения для хранения данных вместо буфера, если в вашем ядре достаточно много работы по проверке границ. Для изображения проверка границ выполняется автоматически аппаратными средствами, в большинстве реализаций практически нет накладных расходов. Поэтому, добавляя ваш глобальный рабочий размер, сохраняйте ваши данные в объекте изображения, тогда вам просто нужно написать свой код, как обычно, не беспокоясь о проверке границ.