opencl - thread - ¿Cuántos subprocesos(o elemento de trabajo) pueden ejecutarse al mismo tiempo?



thread android studio ejemplo (1)

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 subprocesos T (elementos de trabajo) y proporcionar un tamaño de grupo de trabajo (WG), con al menos las siguientes restricciones (consulte la especificación de OpenCL 5.7.3 y 5.8 para obtener detalles):

  • WG debe dividir T
  • WG debe estar a lo sumo 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 subprocesos de un solo grupo de trabajo deben programarse en un único "multiprocesador", pero un solo multiprocesador puede administrar varios grupos de trabajo al mismo tiempo.

Los subprocesos dentro de un grupo de trabajo se ejecutan en grupos de 32 (NVIDIA warp) o 64 (AMD wavefront). Cada microarquitectura 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 hilos. 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 búfer de 4 GB de flotación, puede poner en cola 1G hilos, con WG = 256 por ejemplo. El dispositivo tendrá que programar grupos de trabajo de 4M en su pequeño número de multiprocesadores (por ejemplo, entre 2 y 40).

Soy nuevo en la programación de GPGPU y estoy trabajando con la implementación de OpenCL de NVIDIA.

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

  • ¿Cómo obtengo la cantidad de grupos de trabajo presentes en mi tarjeta (y que pueden ejecutarse al mismo tiempo) y la cantidad de elementos de trabajo presentes en un grupo de trabajo?

  • ¿A qué CL_DEVICE_MAX_COMPUTE_UNITS corresponde?
    Las especificaciones de khronos de los núcleos ("La cantidad de núcleos de cálculo 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 dados a un grupo de trabajo específico o al número de elementos de trabajo que pueden ejecutarse al mismo tiempo en un grupo de trabajo?

Cualquier sugerencia sería muy apreciada.