Política de prohibir la “optimización” de movimiento condicional con `mix()` + `step()` en shaders
(iquilezles.org)Introducción
- Este artículo busca corregir ideas erróneas relacionadas con las bifurcaciones en GPU.
- Algunos sitios web educativos están difundiendo información incorrecta, y se busca corregirla.
Problema
- Se presenta un ejemplo de código que usa el operador ternario para implementar ejecución condicional en código de GPU.
- Algunas personas proponen una “optimización” que lo reemplaza por operaciones aritméticas, pero eso parte de un malentendido.
- El operador ternario realiza un movimiento condicional, y esto se implementa con operaciones de bits simples.
- Las bifurcaciones reales sí ocurren en código de GPU, pero no se usan para pequeños movimientos de registros.
Problemas de la optimización errónea
- La optimización propuesta en realidad se ejecuta más lento que el código original.
- La función
step()está implementada con un operador ternario, por lo que realiza multiplicaciones y sumas innecesarias adicionales. - En el código original, el valor se mueve directamente de forma condicional.
Análisis de código máquina
- A través del código máquina de los compiladores de AMD y Microsoft, puede confirmarse que la GPU no realiza bifurcaciones.
- Se usan operaciones de comparación y máscaras de bits para realizar el movimiento condicional.
Conclusión
-
La propuesta de optimización usando la función
step()es información incorrecta y debe corregirse. -
Esta desinformación se ha difundido durante más de 20 años, y es necesario corregirla.
-
Inigo Quilez - estudiando gráficos por computadora desde 1994.
1 comentarios
Opinión de Hacker News
Estoy convencido de que la conclusión del artículo fuente es correcta, pero el argumento sería más sólido si se mostrara la generación de código de ambas versiones, no solo de la mejor
Ojalá hubiera una buena forma de saber en qué casos
ifrealmente fuerza una bifurcaciónmix/lerp, aunque pueda haber una pequeña sobrecarga, es porque le teme a generar una bifurcaciónv = x > y ? a : b;funcione de verdad, pero preocupa queifsea una construcción que a veces genera bifurcación y a veces noEste artículo también está relacionado: corrige malos consejos sobre cómo escribir bifurcaciones en GPU
Me pregunto por qué el compilador no puede reconocer que la versión "optimizada" es equivalente
step()y optimizar por separado los casosstep()=0.0ystep()==1.0Me he topado con este problema. Claude/ChatGPT también lo sugieren como optimización, pero termina degradando el rendimiento
Me pregunto cómo saber si una función de OpenGL está siendo emulada en lugar de invocar una capacidad nativa de la GPU
Al escribir código, hace falta experiencia para tener la seguridad de que no habrá una bifurcación condicional
Explica cómo funciona la variante de la función
mixpara vectores