¿Qué funciones de OpenGL no están aceleradas por GPU?


Me sorprendió cuando leí esto (de la wiki de OpenGL):

GlTranslate, glRotate, glScale

¿ Están acelerados por hardware?

No, no hay GPU conocidas que ejecuta esto. El conductor calcula el matriz en la CPU y lo sube a la GPU.

Todas las demás operaciones de la matriz son hecho en la CPU también : glPushMatrix, glPopMatrix, glLoadIdentity, glFrustum, glOrtho.

Esta es la razón por qué estas funciones se consideran obsoletos en la LG 3.0. Deberías tener tu propia biblioteca de matemáticas, construir su propia matriz, subir su matriz al sombreador.

Durante un tiempo muy, muy pensé que la mayoría de las funciones de OpenGL utilizan la GPU para hacer cálculos. No estoy seguro de si este es un error común, pero después de un tiempo de pensar, esto tiene sentido. Funciones OpenGL antiguas (2.x y mayores) no son realmente adecuados para aplicaciones del mundo real, debido a demasiados estados interruptor.

Esto me hace darme cuenta de que, posiblemente, muchas funciones OpenGL no usan la GPU en absoluto.

Entonces, la pregunta es:

¿Qué llamadas a funciones de OpenGL no utilizan la GPU?

Creo que conocer la respuesta a la pregunta anterior me ayudaría a convertirme en un mejor programador con OpenGL. Por favor, comparta algunas de sus ideas.

Editar:

Sé que esta pregunta conduce fácilmente al nivel de optimización. Es bueno, pero no es la intención de esta pregunta.

Si alguien conoce un conjunto de funciones GL en cierta implementación popular (como sugirió AshleysBrain, nVidia/ATI y posiblemente dependiente del sistema operativo) que no usan la GPU, ¡eso es lo que busco!

Las guías de optimización plausibles vienen más adelante. Vamos a centrarnos en las funciones, para este tema.

Edit2:

Este tema no trata sobre cómo funcionan las transformaciones de matrices. Hay otros temas para que.

Author: Community, 2010-04-26

5 answers

Chico, es este un gran tema.

Primero, comenzaré con lo obvio: Ya que estás llamando a la función (cualquier función) desde la CPU, tiene que ejecutarse al menos en parte en la CPU. Así que la pregunta realmente es, cuánto del trabajo se realiza en la CPU y cuánto en la GPU.

En segundo lugar, para que la GPU pueda ejecutar algún comando, la CPU tiene que preparar una descripción del comando para pasar. El conjunto mínimo aquí es un token de comando que describe qué hacer, así como los datos para la operación a ejecutar. La forma en que la CPU activa la GPU para hacer el comando también es algo importante. Dado que la mayoría de las veces, esto es costoso, la CPU no lo hace a menudo, sino que procesa comandos en búferes de comandos y simplemente envía un búfer completo para que la GPU lo maneje.

Todo esto para decir que pasar el trabajo a la GPU no es un ejercicio libre. Ese costo tiene que ser enfrentado con solo ejecutar la función en la CPU (no importa de lo que estemos hablando).

Tomando una un paso atrás, usted tiene que preguntarse por qué necesita una GPU en absoluto. El hecho es que una implementación de CPU pura hace el trabajo (como menciona AshleysBrain). El poder de la GPU proviene de su diseño para manejar:

  • tareas especializadas (rasterización, mezcla, filtrado de texturas, blitting,...)
  • cargas de trabajo muy paralelas (DeadMG apunta a eso en su respuesta), cuando una CPU está más diseñada para manejar el trabajo de un solo subproceso.

And those are the guiding principles to siga con el fin de decidir lo que va en el chip. Cualquier cosa que pueda beneficiarse de ellos debe ejecutarse en la GPU. Cualquier otra cosa debería estar en la CPU.

Es interesante, por cierto. Algunas funcionalidades del GL (antes de la obsolescencia, en su mayoría) no están claramente delineadas. Las listas de visualización son probablemente el mejor ejemplo de tal característica. Cada controlador es libre de empujar tanto como quiera de la secuencia de la lista de visualización a la GPU (por lo general en algún formulario de búfer de comandos) para su posterior ejecución, mientras se mantenga la semántica de las listas de visualización de GL (y eso es algo difícil en general). Por lo tanto, algunas implementaciones solo eligen empujar un subconjunto limitado de las llamadas en una lista de visualización a un formato calculado, y eligen simplemente reproducir el resto del flujo de comandos en la CPU.

La selección es otra en la que no está claro si hay valor para ejecutar en la GPU.

Por último, tengo que decir que, en general, hay poca correlación entre las llamadas a la API y la cantidad de trabajo en la CPU o la GPU. Una API de configuración de estado tiende a modificar solo una estructura en algún lugar de los datos del controlador. Su efecto solo es visible cuando se llama a un Sorteo o algo así.

Gran parte de la API de GL funciona así. En ese punto, preguntar si glEnable(GL_BLEND) se ejecuta en la CPU o GPU no tiene sentido. Lo que importa es si la fusión se realizará en la GPU cuando se llame a Draw. Así que, en ese sentido, La mayoría de puntos de entrada de LM no se aceleran en todo.

También podría ampliar un poco en la transferencia de datos, pero Danvil tocado en él.

Terminaré con la pequeña "ruta s/w". Históricamente, GL tuvo que trabajar para especular sin importar cuáles fueran los casos especiales de hardware. Lo que significaba que si el h/w no estaba manejando una característica específica de GL, entonces tenía que emularla, o implementarla completamente en software. Hay numerosos casos de esto, pero uno que golpeó a mucha gente es cuando GLSL comenzó a aparecer.

Puesto que no había práctica manera de estimar el tamaño de código de un sombreador GLSL, se decidió que el GL debía tomar cualquier longitud de sombreador como válida. La implicación era bastante clara: o bien implementar h/w que pudiera tomar sombreadores de longitud arbitraria-no realistas en ese momento-, o implementar una emulación de sombreador s/w (o, como algunos proveedores eligieron, simplemente no ser compatible). Por lo tanto, si activó esta condición en un sombreador de fragmentos, es probable que el completo de su GL terminara ejecutándose en la CPU, incluso cuando tenías una GPU inactiva, al menos para ese sorteo.

 36
Author: Bahbar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-26 20:52:21

La pregunta tal vez debería ser "¿Qué funciones consumen una cantidad inesperadamente alta de tiempo de CPU?"

Mantener una pila de matriz para proyección y vista no es algo que la GPU pueda manejar mejor que una CPU (por el contrario ...). Otro ejemplo sería la compilación de sombreadores. ¿Por qué debería ejecutarse en la GPU? Hay un analizador, un compilador ..., que son solo programas de CPU normales como el compilador de C++.

Las llamadas a funciones potencialmente "peligrosas" son, por ejemplo, glReadPixels, porque los datos se puede copiar de la memoria del host (=CPU) a la memoria del dispositivo (=GPU) a través del bus limitado. En esta categoría también hay funciones como glTexImage_D o glBufferData.

Así que en términos generales, si desea saber cuánto tiempo de CPU consume una llamada a OpenGL, intente comprender su funcionalidad. ¡Y cuidado con todas las funciones, que copian datos del host al dispositivo y viceversa!

 7
Author: Danvil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-26 13:35:57

Normalmente, si una operación es por algo, se producirá en la GPU. Un ejemplo es la transformación real - esto se hace una vez por vértice. Por otro lado, si solo ocurre una vez por operación grande, estará en la CPU, como la creación de la matriz de transformación, que solo se realiza una vez por cada vez que cambia el estado del objeto, o una vez por fotograma.

Esa es solo una respuesta general y alguna funcionalidad ocurrirá al revés, además de ser implementación dependiente. Sin embargo, normalmente, no debería importarle a usted, el programador. Siempre y cuando le permitas a la GPU un montón de tiempo para hacer su trabajo mientras estás fuera haciendo la simulación del juego o lo que sea, o tener un modelo de roscado sólido, no deberías tener que preocuparte tanto por ello.

@enviando datos a la GPU: Por lo que sé (solo se usa Direct3D) todo se hace en shader, para eso están los shaders.

 7
Author: Puppy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-26 17:53:17

GlTranslate, glRotate y glScale cambian la matriz de transformación activa actual. Esta es, por supuesto, una operación de CPU. La vista de modelo y las matrices de proyección solo describen cómo la GPU debe transformar los vértices cuando emite un comando de renderizado.

Así que, por ejemplo, llamando a glTranslate nada se traduce todavía. Antes de renderizar las matrices de proyección y vista de modelo actuales se multiplican (MVP = proyección * modelview), esta matriz única se copia en la GPU y luego en la GPU hace la matriz * multiplicaciones de vértices ("T&L") para cada vértice. Así que la traducción/escala/proyección de los vértices es realizada por la GPU.

Tampoco debería preocuparse por el rendimiento si no usa estas funciones en un bucle interno en algún lugar. glTranslate resulta en tres adiciones. glScale y glRotate son un poco más complejos.

Mi consejo es que deberías aprender un poco más sobre álgebra lineal. Esto es esencial para trabajar con 3D API.

 4
Author: Axel Gneiting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-26 18:10:25

Hay implementaciones renderizadas de software de OpenGL, por lo que es posible que no se ejecuten funciones de OpenGL en la GPU. También hay hardware que no admite ciertos estados de renderizado en hardware, por lo que si establece un cierto estado, cambie a renderizado por software y, de nuevo, no se ejecutará nada en la GPU (aunque haya uno allí). Así que no creo que haya ninguna distinción clara entre' funciones aceleradas por GPU 'y'funciones aceleradas no por GPU'.

Para estar en el lado seguro, mantenga las cosas tan simples como sea posible. El renderizado directo con vértices y las características básicas como Z buffering son lo más probable es que sean aceleradas por hardware, por lo que si puede atenerse a eso con el cambio de estado mínimo, es muy probable que mantenga las cosas aceleradas por hardware. Esta es también la manera de maximizar el rendimiento del renderizado acelerado por hardware: a las tarjetas gráficas les gusta permanecer en un estado y simplemente crujir un montón de vértices.

 2
Author: AshleysBrain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-26 13:39:46