2012-04-10 1 views
9
стандарта

OpenCL определяет следующие параметры, чтобы получить информацию об устройстве и скомпилированные ядро:Каков алгоритм для определения оптимального размера работы группы и числа рабочих групп

  • CL_DEVICE_MAX_COMPUTE_UNITS

  • CL_DEVICE_MAX_WORK_GROUP_SIZE

  • CL_KERNEL_WORK_GROUP_SIZE

  • CL_KERNEL_PREFERRED_W ORK_GROUP_SIZE_MULTIPLE

Учитывая эти значения, как я могу рассчитать оптимальный размер рабочей группы и числа рабочих групп?

ответ

7

Экспериментально вы обнаружите эти значения для своего алгоритма. Используйте профилировщик для получения жестких чисел.

Мне нравится использовать CL_DEVICE_MAX_COMPUTE_UNITS как количество рабочих групп, потому что я часто полагаюсь на синхронизацию рабочих элементов. Я обычно запускаю ядра с небольшим разветвлением, поэтому в одно вычислительное устройство нужно выполнить одно и то же время.

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

Оптимальное соотношение для ALU для извлечения составляет 1: 1 для любого устройства. Это редко достигается на практике, поэтому вы хотите, чтобы банки ALU/SIMD были насыщенными. Это означает, что ALU: выборка должна быть больше 1, когда это возможно. Менее 1 означает, что вы должны попытаться увеличить размер рабочей группы, чтобы лучше скрывать латентность памяти.

+0

Я ориентируюсь на поддержку ряда устройств. Означает ли это, что я должен проверить свои ядра на каждом из них, чтобы получить оптимальные значения для ядра enqueuing? – Kentzo

+0

Проверьте свой алгоритм на устройствах, к которым у вас есть доступ - результаты не должны сильно меняться. Я предлагаю попробовать его на одном устройстве из каждой основной архитектуры, на которую вы хотите настроить таргетинг. Если вы в состоянии, отрегулируйте параметры во время выполнения, чтобы попытаться оптимизировать. Это может изменить оптимальные значения, которые вы обнаружили во время разработки. Получение обратной связи от конечного пользователя/клиента о фактических номерах аппаратного обеспечения позволит вам сосредоточить улучшения на наиболее распространенных устройствах. – mfa

+0

В общем случае использование 'CL_DEVICE_MAX_COMPUTE_UNITS' не даст вам оптимальной производительности (если, возможно, вы не выполняете много синхронизации между рабочими группами, но, как правило, это плохая идея). Я обычно просил бы документацию о хороших ценностях, но я никогда не видел больше рабочих групп, наносящих урон производительности, так что чем больше женился. Обратите внимание, что часть выбора более высоких рабочих групп для скрытия латентности памяти (по крайней мере для gpus) действительна только в том случае, если вы не используете достаточное количество рабочих групп (например CL_DEVICE_MAX_COMPUTE_UNITS, поскольку CU обычно могут поддерживать более одной рабочей группы за раз). – Grizzly

Смежные вопросы