Ответ 1
Вы обнаружите эти значения экспериментально для своего алгоритма. Используйте профилировщик для получения жестких номеров.
Мне нравится использовать CL_DEVICE_MAX_COMPUTE_UNITS как количество рабочих групп, потому что я часто полагаюсь на синхронизацию рабочих элементов. Обычно я запускаю ядра с небольшим разветвлением, поэтому выполняем одно и то же время для выполнения в каждом вычислительном блоке.
Несколько кратных CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE будут оптимальными для вашего устройства. То, что на самом деле такое множество, зависит от вашего шаблона доступа к памяти и типа работы, которую вы выполняете с каждым рабочим элементом. Используйте 1 как многократное, когда вы используете тяжелое ядро с вычислением (ALU). Попробуйте увеличить число, чтобы скрыть задержку памяти, если у вас есть узкое место в доступе к памяти. Используйте профилировщик, чтобы определить, когда оптимальное время доступа и время ALU оптимальны.
Оптимальное соотношение для ALU для извлечения составляет 1:1 для любого устройства. Это редко достигается на практике, поэтому вы хотите, чтобы банки ALU/SIMD были насыщенными. Это означает, что ALU: выборка должна быть больше 1, когда это возможно. Менее 1 означает, что вы должны попытаться увеличить размер рабочей группы, чтобы лучше скрывать латентность памяти.