¿Cómo controlo qué cálculos se realizan en la CPU y cuáles en la GPU?

14

Mi comprensión actual es que todo lo que se hace en un archivo de sombreador se hace en la GPU, y todo lo que se hace en mi código (Java, en mi caso) se hace en la CPU.

¿Es esta una descripción precisa?

Bajista
fuente
2
También puede hacer computación en la GPU usando algo como OpenCL, que esencialmente le permite ejecutar código en la GPU.
Jabonoso

Respuestas:

20

Esa es la esencia de esto.

En principio, la plataforma podría, posiblemente, hacer lo que quiera. Uno podría imaginar un sistema operativo avanzado haciendo una traducción justo a tiempo de código compilado de, digamos, x86 a código GPU. Del mismo modo, los controladores OpenGL pueden ejecutar lo que quieran en la CPU del host.

Pero en realidad, lo que acabas de describir es lo que sucede.

David Van Brink
fuente
55
IIRC, los sombreadores se compilan en la CPU antes de enviarse a la GPU. Y eso lo hace el controlador de GPU sin el sistema operativo.
MSalters
Cierto. He tratado con muchos errores de compilación durante la ejecución del programa en los sombreadores, incluso cuando el código de Java ya se ha compilado.
Bassinator
1
Teórico: Digamos que tenía un programa que requiere mucha CPU pero que era solo una interfaz de línea de comandos (sin trabajo gráfico). ¿Podría descargar parte del trabajo a la GPU? En realidad no estoy planeando hacer esto, es solo una cosa conceptual que me interesa.
Bassinator
2
¡Si! El enlace que @return true publicó es para una biblioteca Java que hace eso. De manera más general, puede escribir un "sombreador de cómputo" en OpenGL o usar OpenCL. En todos los casos, debe aislar parte de su código que es paralelizable y pasar información dentro y fuera de él. (Las GPU son geniales para tareas "vergonzosamente paralelas")
David Van Brink
1
Un asterisco para agregar a esta respuesta es que algunas implementaciones apoyan la idea de un "preshader", es decir, un código que es parte del shader, pero cuyo resultado será constante en todas las invocaciones en una llamada de sorteo dada (como multiplicar la vista uniforme) y matrices de proyección). Un compilador de sombreador tan inclinado puede identificar bits de código como este y elevarlos para que se ejecuten una vez que estén en el lado de la CPU, incluida la salida constante resultante en el trabajo enviado a la GPU. Ese es un caso común donde la suposición "shader = GPU" podría estar doblada, aunque solo en detalle.
DMGregory
7

En general sí. Java se usa para escribir programas que se ejecutan en la CPU. Los lenguajes de sombreado (cg, hlsl, et al) se utilizan para escribir programas que se ejecutan en la gpu.

Una excepción a la regla sería usar API de terceros que pueden cerrar la brecha.

volver verdadero
fuente
1
Consejo muy interesante, su enlace a "aparapi". Ejecute un código JVM en la GPU ... ¡intrigante!
David Van Brink
3

David Van Brink respondió a su pregunta en general.

Pero como él dice, el controlador OpenGL podría ejecutar cosas en la CPU, y en realidad sucede mucho. Especialmente con contextos de compatibilidad, donde algunas funciones heredadas extrañas no se pueden implementar en las tarjetas gráficas. Requieren emulación de software. Por ejemplo, he escuchado antes que el punteado se ejecuta en la CPU. Puede esperar también sorpresas con la elección.
Estas sorpresas pueden suceder aún más en MacOS con contextos 2.1, porque Apple ha unificado la vista de OpenGL bastante bien en todo su rango de hardware, y algunos hardware más pequeños carecen de algunas cosas que deben ser emuladas. Llega a ser realmente posible ejecutar la especificación ENTERA OpenGL 2.1 completamente en la CPU, si el código de creación de contexto especifica un dispositivo de software explícitamente.

Por el contrario, el código que se ejecuta a través de bibliotecas de computación como vexcl o boost compute, o el AMP de microsoft, o nVidia thrust, PUEDE ejecutarse en la GPU o la CPU dependiendo de los indicadores de configuración de API.

Y para finalizar, dentro de la CPU también tienes una arquitectura DSP con la parte que llamamos SIMD. El compilador ispc de Intel proporciona ayuda para generar código que está "garantizado" para ejecutarse en carriles SIMD con muchos diagnósticos de rendimiento en tiempo de compilación para ayudarlo a aprovecharlo al máximo. Agregue OpenMP a eso y puede obtener SIMD multiproceso, que se acerca a los conceptos de GPU. Si tiene una CPU de gama alta y una GPU de gama baja, esto en realidad puede ser más eficiente.
http://ispc.github.io/

v.oddou
fuente