¿Debo calcular matrices en la GPU o en la CPU?


¿Debería preferir calcular matrices en la CPU o GPU?

Digamos que tengo las siguientes matrices P * V * M, ¿debo calcularlas en la CPU para poder enviar la matriz final a la GPU (GLSL) o debo enviar esas tres matrices por separado a la GPU para que GLSL pueda calcular la matriz final?

Quiero decir que en este caso GLSL tendría que calcular la matriz MVP para cada vértice, por lo que probablemente sea más rápido precomputarla en la CPU.

Pero digamos que GLSL sólo tiene que calcular la matriz MVP una vez, sería la GPU calcular la matriz final más rápido que la CPU?

Author: Maik Klein, 2013-05-18

2 answers

Regla general: Si se puede pasar a un sombreador en forma de un uniforme , siempre precalcular en la CPU; sin excepciones. Los cálculos en el lado del sombreador solo tienen sentido para valores que varían entre vértices y fragmentos. Todo lo que es constante entre todo un lote de vértices se trata más eficientemente en la CPU.

Las GPU no son máquinas mágicas que "pueden hacer todo más rápido". Hay ciertas tareas en las que una CPU puede superar fácilmente a una GPU, incluso para tareas muy grandes DataSet. Así que una guía muy simple es: Si se puede mover a la CPU sin gastar más tiempo de CPU haciendo el cálculo de lo que se necesita para la GPU en la sobrecarga total para procesarlo, a continuación, hacerlo en la CPU. El cálculo de una sola matriz es una de esas tareas.

 56
Author: datenwolf,
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
2013-05-18 08:24:06

Como la mayoría de las situaciones con OpenGL, depende.

En la mayoría de los casos, un solo cálculo se puede hacer más rápido en la CPU que en la GPU. La ventaja de la GPU es que puede hacer muchos cálculos en paralelo.

Por otro lado, también depende de dónde estén tus cuellos de botella. Si su CPU está haciendo mucho trabajo, pero sus shaders aún no son un cuello de botella en el sistema de destino de menor potencia, entonces podría ver fácilmente alguna mejora en el rendimiento moviendo alguna matriz multiplicaciones al sombreador de vértices.

Generalmente, debe evitar cualquier trabajo en el sombreador de fragmentos que también se pueda hacer en el sombreador de vértices o en la CPU, pero más allá de eso, depende de la situación. A menos que se encuentre con problemas de rendimiento, simplemente hágalo de la manera que sea más fácil para usted, y si tiene problemas de rendimiento, hágalo de ambas maneras y perfile el rendimiento para ver cuál funciona mejor.

 13
Author: bcrist,
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
2013-05-18 07:04:32