2012-04-10 14 views
9
estándar

OpenCL define las siguientes opciones para obtener información sobre el dispositivo y el núcleo compilado:¿Cuál es el algoritmo para determinar el tamaño del grupo de trabajo óptimo y el número de grupo de trabajo

  • CL_DEVICE_MAX_COMPUTE_UNITS

  • CL_DEVICE_MAX_WORK_GROUP_SIZE

  • CL_KERNEL_WORK_GROUP_SIZE

  • CL_KERNEL_PREFERRED_W ORK_GROUP_SIZE_MULTIPLE

Teniendo en cuenta estos valores, ¿cómo puedo calcular el tamaño óptimo del grupo de trabajo y el número de grupos de trabajo?

Respuesta

7

Descubres estos valores experimentalmente para tu algoritmo. Use un generador de perfiles para obtener números duros.

Me gusta usar CL_DEVICE_MAX_COMPUTE_UNITS como el número de grupos de trabajo, porque a menudo confío en la sincronización de elementos de trabajo. Usualmente ejecuto kernels con poca ramificación, por lo que la toma el mismo tiempo para ejecutar en cada unidad de cómputo.

Algunos múltiplos de CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE serán óptimos para su dispositivo. Lo que ese múltiplo realmente es depende de su patrón de acceso a la memoria y del tipo de trabajo que está haciendo con cada elemento de trabajo. Use 1 como el múltiplo cuando está ejecutando un kernel pesado, de procesamiento computarizado (ALU). Pruebe con un múltiplo más grande para ocultar la latencia de la memoria si tiene problemas de acceso a la memoria. Use un generador de perfiles para determinar cuándo su tiempo de acceso y su tiempo de ALU son óptimos.

La relación óptima para la recuperación de ALU es 1: 1 para cualquier dispositivo. Esto rara vez se logra en la práctica, por lo que desea mantener saturados los bancos ALU/SIMD. Esto significa que ALU: fetch debe ser mayor que 1 siempre que sea posible. Menos de 1 significa que debe intentar un tamaño de grupo de trabajo más grande para ocultar mejor la latencia de memoria.

+0

Estoy orientado para admitir una variedad de dispositivos. ¿Significa esto que tengo que probar mis kernels en cada uno de ellos para obtener los valores óptimos para la puesta en cola del kernel? – Kentzo

+0

Pruebe su algoritmo en los dispositivos a los que tiene acceso, los resultados no deberían variar demasiado. Sugiero probarlo en un dispositivo de cada arquitectura principal que desea orientar. Si puede, ajuste los parámetros en tiempo de ejecución para intentar optimizar. Esto podría modificar los valores óptimos que descubrió durante el desarrollo. Recibir comentarios del usuario/cliente final sobre los números de hardware reales le permitirá enfocar las mejoras en los dispositivos más comunes. – mfa

+0

En general, el uso de 'CL_DEVICE_MAX_COMPUTE_UNITS' no le dará un rendimiento óptimo (a menos que haga una gran cantidad de sincronización entre grupos de trabajo, pero en general es una mala idea). Por lo general, le pedía a la documentación buenos valores, pero nunca había visto a más grupos de trabajo perjudicando el rendimiento, por lo tanto, cuanto más marrón. Tenga en cuenta que la parte sobre elegir grupos de trabajo más altos para ocultar latencia de memoria es (al menos para gpus) solo cierta si no usa suficientes grupos de trabajo (como CL_DEVICE_MAX_COMPUTE_UNITS, ya que las CU normalmente pueden mantener más de un grupo de trabajo a la vez). – Grizzly

Cuestiones relacionadas