2011-06-21 28 views
7

Estoy usando OpenCL y tengo la tarjeta ATI 4850. Dispone de:¿Cuántas tareas se pueden ejecutar simultáneamente en el dispositivo GPU?

  • CL_DEVICE_MAX_COMPUTE_UNITS: 10
  • CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: 3
  • CL_DEVICE_MAX_WORK_GROUP_SIZE: 256
  • CL_DEVICE_MAX_WORK_ITEM_SIZES: (256, 256, 256)
  • CL_DEVICE_AVAILABLE: 1
  • CL_DEVICE_NAME: ATI RV770

Cuántas ta sks puede ejecutar simultáneamente?

¿Es CL_DEVICE_MAX_COMPUTE_UNITS * CL_DEVICE_MAX_WORK_ITEM_SIZES = 2560?

Para ser más específicos: un procesador de un solo núcleo puede ejecutar solo una tarea en un momento, Dual-Core puede ejecutar 2 tareas ... ¿Cuántas tareas pueden ejecutar mi GPU en un momento? O reformulado: ¿Cuántos procesadores tiene mi GPU?

+0

¿Qué quieres decir? ¿Cuántos kernels se pueden ejecutar a la vez o cuántos hilos se pueden ejecutar en la GPU? –

+0

Probablemente núcleos. He visto la especificación, se llama "Elemento de procesamiento". Entonces la pregunta puede ser reformulada: "¿Cuántos elementos de procesamiento tiene mi GPU?" – Dmitriy

+0

No se puede decir tan fácilmente. Una GPU tiene varias unidades de cálculo, cada una de las cuales ejecuta varios hilos ("warp" o "wavefront") simultáneamente, en paralelo. Para nVidia esto es actualmente 32, para ATI 64. No estoy seguro de si hay un límite CL que se relaciona con el tamaño de la urdimbre. Además, cada unidad puede tener un número desconocido (nVidia dice 1024 en algún documento) de subprocesos en vuelo por unidad de cómputo que están programados por hardware cuando una disformidad bloquea por alguna razón. Suponiendo números similares, eso haría que tu GPU esté más cerca de los 320,000 hilos. – Damon

Respuesta

6

El RV770 tiene 10 núcleos SIMD, cada uno formado por 16 núcleos de sombreado, cada uno de los cuales consta de 5 ALU (arquitectura VLIW5). Un total de 800 ALU que pueden hacer cálculos paralelos. No creo que haya una manera de sacar todos estos números de OpenCL. Tampoco estoy seguro de qué equivaldría a un núcleo de CPU. Tal vez un núcleo shader? Puede leer sobre VLIW at Wikipedia. Es un diseño interesante.

Si dice que un núcleo de CPU solo está ejecutando una "tarea" en un momento dado, aunque tiene varias ALU funcionando en paralelo, entonces creo que puede decir que el RV770 estaría trabajando en 160 tareas. Pero con las diferencias en cómo funcionan los diferentes chips, creo que "núcleo" y "tarea" pueden ser difíciles de definir. Una CPU con hyperthreading puede incluso ejecutar dos juegos de códigos al mismo tiempo. Con OpenCL no creo que sea posible ejecutar más de un kernel en un momento dado, a menos que las actualizaciones recientes del controlador hayan cambiado eso.

De todos modos, creo que es más importante presentar su trabajo a la GPU de una manera que ofrezca el mejor rendimiento. Lamentablemente, no hay forma de encontrar el mejor tamaño de grupo de trabajo aparte de la experimentación. Al menos no que yo sepa. Una ayuda es que si los controladores admiten OpenCL 1.1 puede consultar CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE y establecer el tamaño de su trabajo en un múltiplo de eso. De lo contrario, ir por un múltiplo de 64 es probablemente una apuesta segura.

+1

Creo que encontrará que es el núcleo SIMD (** Single Instruction **, Multiple Data) el que hace que las instrucciones capten y decodifiquen, y luego las alimenta esas instrucciones a los sombreadores. Por lo tanto, los 16 núcleos de sombreado tienen que ejecutar el mismo código en un momento determinado. El resultado es que un RV770 solo podría trabajar en 10 tareas, no en 160. –

1

El trabajo en GPU termina convirtiéndose en wavefronts/warps.

El uso de una GPU para la interfaz de usuario y el cálculo lo usa efectivamente para muchos programas sin tenerlo en cuenta. Muchos para el dibujo de la GUI, además de los núcleos de cómputo que está ejecutando. Los clientes Fast OpenCL son asincrónicos y se superponen a varias instancias de trabajo, por lo que no estarán vinculados a la latencia. Se espera que use varios núcleos en paralelo.

No parece haber un límite "duro" aparte de la memoria que limite el número de almacenamientos intermedios que puede usar. Cuando se utiliza la misma GPU para la interfaz de usuario y el cálculo, debe acelerar su trabajo. En mi experiencia, emitir demasiado trabajo provocará la inanición de la GUI y/o sus núcleos de cómputo. No parece haber nada en el camino para garantizar que no se morirá de hambre (largas demoras antes de que un elemento de trabajo comience a ejecutarse realmente). Algunos elementos de trabajo pueden permanecer durante mucho tiempo (10 segundos o más en casos malos) mientras la GPU hace otros elementos de trabajo. Yo especulo que los artículos se envían a las tuberías en función de la disponibilidad de datos y hay poco o nada para evitar la inanición de los elementos de trabajo.

La limitación de la adelantada del trabajo mejora en gran medida la capacidad de respuesta de la GUI al dejar que la GPU agote casi/a veces su cola de trabajo, lo que reduce los retrasos en el procesamiento del gráfico.

Cuestiones relacionadas