Стандарт OpenCL не определяет, как абстрактная модель выполнения, предоставляемая OpenCL, отображается на аппаратное обеспечение. Вы можете поставить в очередь любое число потоков (рабочих элементов) и указать размер рабочей группы (WG), как минимум, со следующими ограничениями (подробности см. В спецификациях OpenCL 5.7.3 и 5.8):
- РГ должна разделить Т
- РГ должна быть не более
DEVICE_MAX_WORK_GROUP_SIZE
- WG должно быть не более
KERNEL_WORK_GROUP_SIZE
возвращено GetKernelWorkGroupInfo
; он может быть меньше максимального размера рабочей группы устройства, если ядро потребляет много ресурсов.
Реализация управляет выполнением ядра на оборудовании. Все потоки одной рабочей группы должны быть запланированы на одном «многопроцессорном», но один многопроцессорный может одновременно управлять несколькими рабочими группами.
Потоки внутри рабочей группы выполняются группами по 32 (деформация NVIDIA) или 64 (волновой фронт AMD). Каждая микроархитектура делает это по-своему. Более подробную информацию вы найдете на форумах NVIDIA и AMD, а также в различных документах, предоставляемых каждым поставщиком.
Чтобы ответить на ваш вопрос: количество потоков не ограничено. В реальном мире ваша проблема ограничена размером входов / выходов, то есть размером памяти устройства. Для обработки буфера с плавающей запятой 4 ГБ вы можете поставить в очередь потоки 1G, например, с WG = 256 Устройство должно будет планировать рабочие группы 4M на своем небольшом количестве (скажем, от 2 до 40) мультипроцессоров.