2011-04-15 27 views
15

Soy nuevo en la programación de GPGPU y estoy trabajando con la implementación de NVIDIA de OpenCL.¿Cuántos hilos (o elementos de trabajo) se pueden ejecutar al mismo tiempo?

Mi pregunta era cómo calcular el límite de un dispositivo GPU (en número de subprocesos).
Por lo que entendí, hay una cantidad de grupos de trabajo (el equivalente de bloques en CUDA) que contienen una cantidad de elementos de trabajo (~ hilo cuda).

  • ¿Cómo consigo el número de grupo de trabajo presente en mi tarjeta (y que se pueden ejecutar al mismo tiempo) y el número de trabajos ítems presentes en un grupo de trabajo?

  • ¿A qué corresponde CL_DEVICE_MAX_COMPUTE_UNITS?
    La especificación khronos speeks de núcleos ("El número de núcleos informáticos paralelos en el dispositivo OpenCL.") Cuál es la diferencia con el núcleo CUDA que figura en la especificación de mi tarjeta gráfica. En mi caso, openCL da 14 y mi GeForce 8800 GT tiene 112 núcleos basados ​​en el sitio web de NVIDIA.

  • ¿CL_DEVICE_MAX_WORK_GROUP_SIZE (512 en mi caso) corresponde al total de elementos de trabajo asignados a un grupo de trabajo específico o al número de elementos de trabajo que se pueden ejecutar al mismo tiempo en un grupo de trabajo?

Cualquier sugerencia sería muy apreciada.

Respuesta

21

El estándar OpenCL no especifica cómo el modelo de ejecución abstracta proporcionado por OpenCL se asigna al hardware. Puede poner en cola cualquier número de hilos (T elementos de trabajo), y proporcionar un tamaño de grupo de trabajo (WG), con al menos las siguientes limitaciones (ver especificación OpenCL 5.7.3 y 5.8 para más detalles):

  • WG debe dividir T
  • WG debe ser como máximo DEVICE_MAX_WORK_GROUP_SIZE
  • WG debe ser como máximo KERNEL_WORK_GROUP_SIZE devuelto por GetKernelWorkGroupInfo; puede ser más pequeño que el tamaño máximo del grupo de trabajo del dispositivo si el kernel consume muchos recursos.

La implementación gestiona la ejecución del kernel en el hardware. Todos los hilos de un único grupo de trabajo deben programarse en un único "multiprocesador", pero un único multiprocesador puede administrar varios grupos de trabajo al mismo tiempo.

Los subprocesos dentro de un grupo de trabajo se ejecutan por grupos de 32 (NVIDIA warp) o 64 (AMD wavefront). Cada micro-arquitectura hace esto de una manera diferente. Encontrará más detalles en los foros de NVIDIA y AMD, y en los diversos documentos proporcionados por cada proveedor.

Para responder a su pregunta: no hay límite para el número de subprocesos. En el mundo real, su problema está limitado por el tamaño de las entradas/salidas, es decir, el tamaño de la memoria del dispositivo. Para procesar un buffer de 4GB de flotante, puede poner en cola hilos 1G, con WG = 256 por ejemplo. El dispositivo deberá programar grupos de trabajo 4M en su pequeño número (digamos entre 2 y 40) de multiprocesadores.

Cuestiones relacionadas