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