2012-02-17 10 views
10

Necesito alguna aclaración. Estoy desarrollando OpenCL en mi computadora portátil con una pequeña GPU nvidia (310M). Cuando consulto el dispositivo para CL_DEVICE_MAX_COMPUTE_UNITS, el resultado es 2. Leo el número de grupos de trabajo para ejecutar un kernel que debe corresponderse con el número de unidades de cálculo (Heterogenous Computing with OpenCL, Capítulo 9, p.186), de lo contrario, se desperdiciaría demasiado memoria bandwitdhNúmero de unidades de cómputo correspondientes al número de grupos de trabajo

También se especifica que el chip tiene 16 núcleos cuda (que corresponden a PE, en mi opinión). ¿Significa eso teóricamente que la configuración más eficiente para este gpu, con respecto al ancho de banda de la memoria global, es tener dos grupos de trabajo con 16 elementos de trabajo cada uno?

Respuesta

16

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í.

+0

Lo leeré, gracias. – rdoubleui

2

Ni siquiera creo que igualar el conteo de su grupo de trabajo para calcular unidades es una buena idea en una CPU. Es mejor sobresuscribir los núcleos por varias veces. Esto permite que la carga de trabajo se mueva dinámicamente (en cuantos de grupo de trabajo) a medida que varios procesadores se conectan o se distraen con otro trabajo. El grupo de trabajo count = CL_DEVICE_MAX_COMPUTE_UNITS solo funciona bien en una máquina que no hace absolutamente nada y desperdicia mucha energía manteniendo despiertos los núcleos no utilizados.

Cuestiones relacionadas