Use GPU y CPU sabiamente

Soy novato en OpenCL, acabo de empezar a aprender. Quería saber si es posible ejecutar algunos subprocesos en la GPU y los subprocesos restantes en la CPU. En otras palabras, si lanzo 100 subprocesos y asumo que tengo una CPU de 8 núcleos, ¿es posible que 8 de cada 100 subprocesos se ejecuten en la CPU y los 92 subprocesos restantes se ejecuten en la GPU? ¿Puede OpenCL ayudarme a hacer este trabajo? ¿suavemente?

preguntado el 12 de junio de 12 a las 21:06

No, no es así como funciona OpenCL. -

Ohh... @talonmies, ¿cómo puedo lograr ese trabajo? ¿Con Pthreads en el lado del host? -

3 Respuestas

Quería saber si es posible ejecutar algunos subprocesos en la GPU y los subprocesos restantes en la CPU.

En otras palabras, si lanzo 100 subprocesos y asumo que tengo una CPU de 8 núcleos, ¿es posible que 8 de cada 100 subprocesos se ejecuten en la CPU y los 92 subprocesos restantes se ejecuten en la GPU?

No. Esa descripción sugiere que estaría viendo la GPU y la CPU como un único recurso informático. No puedes hacer eso.

Eso no significa que no pueda tener a ambos trabajando en la misma tarea.

  • La GPU y la CPU se considerarán dispositivos OpenCL separados.
  • Puede escribir código que pueda comunicarse con varios dispositivos.
  • Puede compilar el mismo núcleo para varios dispositivos.
  • Puede solicitar que varios dispositivos funcionen al mismo tiempo.

...pero...

  • Nada de esto es automático.
  • OpenCL no dividirá una sola llamada NDRange (o equivalente) entre varios dispositivos.
  • Esto significa que tendría que programar tareas entre los dos dispositivos usted mismo.
  • Habrá una disparidad bastante grande en la velocidad, por lo que mantenerla óptima requerirá más de "92 aquí, 8 allá".

Lo que he encontrado que funciona mejor es que la CPU trabaje en una tarea diferente mientras la GPU está funcionando. Tal vez preparando el siguiente trabajo para la GPU o procesando los resultados de la GPU. A veces, este es un código normal. A veces es OpenCL.

Respondido el 13 de junio de 12 a las 09:06

A veces no se puede paralelizar un algoritmo, en ese caso la CPU funciona más rápido que la GPU, así que quería darle esa tarea a la CPU y dejar que la GPU hiciera el trabajo que puede hacer de mejor manera. Leí algunos trabajos de investigación sobre la diferencia de rendimiento entre CUDA y OpenCL y descubrí que OpenCL NO funciona mejor que CUDA, así que aparte de la portabilidad, ¿vale la pena invertir algo de tiempo en OpenCL para obtener beneficios de rendimiento? - nombre de usuario_4567

De hecho, a veces un algoritmo no tiene paralelismo para explotar, por lo que mantener eso en la CPU tiene sentido, especialmente si puede darle a la GPU otra cosa que hacer. En términos de esta discusión, CUDA vs OpenCL es irrelevante. - Paul S

Puede usar varios dispositivos openCL para trabajar en su algoritmo, pero la carga de trabajo debe dividirse de manera lo suficientemente sutil para que el trabajo entre dispositivos se equilibre correctamente, de lo contrario, la sobrecarga puede empeorar su tiempo de ejecución.

Se establece claramente en el Guía de programación AMD OpenCL sección 4.7 sobre el uso de varios dispositivos OpenCL, por lo que mi respuesta es sí, puede dividir el trabajo para ser ejecutado con múltiples dispositivos, sin problemas, si y solo si su algoritmo de programación es lo suficientemente inteligente como para equilibrar todo.

Respondido el 13 de junio de 12 a las 02:06

Estoy trabajando con GPU nVIDIA y supongo que este truco también puede funcionar con sus GPU, ¿verdad? - nombre de usuario_4567

Sí tu puedes. Pero como dije, solo si tiene un buen algoritmo de programación, y por cierto, hay muchas variables que debe considerar para hacer uno bueno, como la sobrecarga de transferencia de memoria, el uso de memoria compartida, qué tan grande usará su kernel registros, todo de ellos afectará al programador de equilibrio de carga. - ardiyu07

Tenga en cuenta que es muy fácil sobrecargar su CPU. DEBE evitarlo; de lo contrario, su GPU permanecerá sin funcionar la mayor parte del tiempo porque la CPU está ocupada computando y no puede procesar eventos. Mira el excelente artículo sobre Dispositivo Fisson de Intel - Kentzo

El código openCL se compila en tiempo de ejecución para el dispositivo seleccionado (CPU, modelo de GPU)

Puede cambiar el objetivo que usa para diferentes tareas, pero no puede (con ninguna implementación que conozca) dividir la misma tarea entre CPU y GPU

Respondido el 12 de junio de 12 a las 21:06

una pregunta algo relacionada se puede encontrar aquí stackoverflow.com/questions/3245592/… no soy capaz de entenderlo claramente .. - nombre de usuario_4567

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.