Mientras ajusta el número de grupos de trabajo sea igual a CL_DEVICE_MAX_COMPUTE_UNITS
podría ser un buen consejo en algún hardware, ciertamente no es en las GPU NVIDIA.
En la arquitectura CUDA, una unidad de cálculo OpenCL es el equivalente de un multiprocesador (que puede tener 8, 32 o 48 núcleos), y están diseñados para ejecutar simultáneamente hasta 8 grupos de trabajo (bloques en CUDA) cada. En tamaños de datos de entrada más grandes, puede optar por ejecutar miles de grupos de trabajo, y su GPU particular puede manejar hasta 65535 x 65535 grupos de trabajo por lanzamiento del kernel.
OpenCL tiene otro atributo de dispositivo CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE
. Si consulta eso en un dispositivo NVIDIA, devolverá 32 (este es el "warp", o el ancho SIMD natural del hardware). Ese valor es el tamaño del grupo de trabajo múltiple que debe usar; los tamaños del grupo de trabajo pueden ser de hasta 512 elementos cada uno, dependiendo de los recursos consumidos por cada elemento de trabajo. La regla general para su GPU particular es que necesita al menos 192 elementos de trabajo activos por unidad de cómputo (subprocesos por multiprocesador en términos CUDA) para cubrir toda la latencia de la arquitectura y potencialmente obtener ancho de banda completo de memoria o rendimiento aritmético completo, dependiendo en la naturaleza de tu código
NVIDIA envía un buen documento llamado "Guía de programación de OpenCL para la arquitectura CUDA" en el kit de herramientas CUDA. Debe tomarse un tiempo para leerlo, ya que contiene todos los detalles de cómo la implementación de NVIDIA OpenCL se asigna a las características de su hardware, y responderá las preguntas que ha planteado aquí.
Lo leeré, gracias. – rdoubleui