La domanda non può essere risolta in alcun modo definitivo nel suo insieme. Per quanto tempo qualsiasi operazione richiede hardware non è solo specifica dell'hardware, ma anche codice specifico. In altre parole, il codice circostante può mascherare completamente le prestazioni di un'operazione, oppure può richiedere più tempo.
In generale, non si deve presumere che un prodotto punto sia a ciclo singolo.
Tuttavia, ci sono alcuni aspetti che possono certamente essere risolta:
Ho visto anche un credito nei commenti qualche parte che:
sarebbe un modo più efficiente per media quattro valori, rispetto a:
mi sarebbe aspettatevi di essere un pò vero, purché x
, y
, z
e w
sono infatti diversi valori float piuttosto che membri dello stesso vec4
(ovvero, non sono value.x
, value.y
, ecc.). Se sono elementi dello stesso vettore, direi che qualsiasi compilatore di ottimizzazione decente dovrebbe compilare entrambi allo stesso insieme di istruzioni. Un buon peephole optimizer dovrebbe catturare modelli come questo.
Dico che è "un po 'vero", perché dipende dall'hardware. La versione del prodotto dot non dovrebbe per lo meno essere più lenta. E ancora, se sono elementi dello stesso vettore, l'ottimizzatore dovrebbe gestirlo.
singole istruzioni, ma vuol dire che sono altrettanto computazionalmente costosi come fare un vec4 add?
Non si deve presumere che il montaggio ARB ha qualsiasi relazione al codice di istruzione macchina hardware vero e proprio.
Esiste fondamentalmente qualche implementazione hardware, sulla falsariga di moltiplicare-accumulare sugli steroidi, in gioco qui?
Se si vuole parlare di hardware, è molto specifico dell'hardware. C'era una volta, c'era l'hardware specializzato per i prodotti puntini. Questo è stato ai tempi del cosiddetto "bumpmapping DOT3" e della prima era degli shader.
Tuttavia, al fine di accelerare le operazioni generali, hanno dovuto prendere questo genere di cose. Così ora, per la maggior parte dell'hardware moderno (ovvero: qualsiasi dispositivo Radeon classe HD o NVIDIA 8xxx o superiore, il cosiddetto DX10 o 11 hardware), i prodotti puntini fanno praticamente quello che dicono di fare. Ogni moltiplicazione/aggiunta riprende un ciclo.
Tuttavia, questo hardware consente anche molto parallelismo, quindi è possibile avere 4 prodotti vec4
separati contemporaneamente. Ognuno prenderebbe 4 cicli. Ma, fintanto che i risultati di queste operazioni non vengono utilizzati negli altri, possono essere eseguiti tutti in parallelo. E quindi, i quattro di loro totali richiederebbero 4 cicli.
Quindi, di nuovo, è molto complicato. E dipendente dall'hardware.
La soluzione migliore è iniziare con qualcosa che è ragionevole. Poi scopri l'hardware che stai cercando di codificare e lavora da lì.
Ok, grazie. "Non dovresti assumere che l'assemblaggio ARB abbia alcuna relazione con il codice di istruzioni della macchina hardware". è fondamentalmente la risposta concisa che speravo. Sembra proprio che ARB sia un po 'di nicchia e difficile trovare un sacco di materiale su Google. Questo era uno di quei tipi di "conoscenza tribale" che non riuscivo a verificare, e il fatto che fosse vero per un periodo di tempo ha un senso. Roba forte. – ultramiraculous