La pregunta no puede responderse de ninguna manera definitiva como un todo. El tiempo que tarda una operación en hardware no es solo específico del hardware, sino también , código específico. Es decir, el código circundante puede enmascarar por completo el rendimiento que requiere una operación, o puede hacerlo demorar más tiempo.
En general, no debe suponer que un producto escalar es de ciclo único.
Sin embargo, hay ciertos aspectos que sin duda puede ser respondida:
También he visto una reclamación en los comentarios en alguna parte que:
habría una manera más eficiente de los valores promedio de cuatro, en comparación a:
que sería de esperar que esto sea un poco cierto, siempre y cuando x
, y
, z
, y w
están en valores de coma flotante de datos diferentes en lugar de miembros de la misma vec4
(es decir, no son value.x
, value.y
, etc.). Si son elementos del mismo vector, diría que cualquier compilador de optimización decente debería compilar ambos con el mismo conjunto de instrucciones. Un buen peephole optimizer debería atrapar patrones como este.
Digo que es "un poco cierto", porque depende del hardware. La versión del producto punto no debe ser más lenta. Y nuevamente, si son elementos del mismo vector, el optimizador debería manejarlo.
instrucciones individuales, pero ¿eso significa que son tan costosas desde el punto de vista informático como hacer un vec4 add?
Usted no debe asumir que el montaje ARB tiene ningún relación con el código real instrucción de máquina hardware.
¿Hay básicamente alguna implementación de hardware, en la línea de multiplicar-acumular en esteroides, en juego aquí?
Si quiere hablar de hardware, es muy específico del hardware. Había una vez un hardware especializado de productos dot. Esto fue en los días del llamado "bumpmapping DOT3" y la era de Shaders DX8 temprana.
Sin embargo, para acelerar las operaciones generales, tuvieron que sacar ese tipo de cosas. Así que ahora, para la mayoría del hardware moderno (también conocido como: cualquier clase de Radeon HD o NVIDIA 8xxx o superior) denominado hardware DX10 u 11), los productos de punto hacen más o menos lo que dicen que hacen. Cada multiplicación/adición toma un ciclo.
Sin embargo, este hardware también permite un montón de paralelismo, por lo que podría tener 4 productos de puntos vec4
separados que ocurran simultáneamente. Cada uno tomaría 4 ciclos. Pero, siempre que los resultados de estas operaciones no se usen en los otros, todos pueden ejecutarse en paralelo. Y por lo tanto, los cuatro de ellos total tomarían 4 ciclos.
Así que de nuevo, es muy complicado. Y depende del hardware.
Su mejor apuesta es comenzar con algo que es razonable. Luego aprende sobre el hardware al que intentas codificar y trabaja desde allí.
Ok, gracias. "No debe suponer que el ensamblado ARB tiene alguna relación con el código de instrucción de máquina de hardware real". es básicamente la respuesta concisa que estaba esperando. Parece que ARB es un nicho y es difícil encontrar un montón de material apto para Google. Esta fue una de esas cosas del tipo de "conocimiento tribal" que no pude verificar, y el hecho de que era cierto por un período de tiempo tiene sentido. Cosas interesantes. – ultramiraculous