2012-05-25 9 views
9

Ich bin auf mehrere Situationen gestoßen, in denen behauptet wird, dass das Ausführen eines Skalarprodukts in GLSL in einem Zyklus ausgeführt wird. Zum Beispiel:GLSL - Kostet ein Dot-Produkt wirklich nur einen Zyklus?

Vertex und Fragment-Prozessoren arbeiten auf Vierervektoren, Durchführen Vierkomponentenanweisungen wie Additionen, Multiplikationen, Multiplizieren-ansammelt, oder Punktprodukte in einem einzigen Zyklus.

dot(value, vec4(.25)) 

eine effizientere Art und Weise vier Werte Durchschnitt wäre im Vergleich zu:

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter35.html

Ich habe auch einen Anspruch in den Kommentaren, dass irgendwo gesehen

(x + y + z + w)/4.0 

Es wurde wiederum behauptet, dass Punkt (vec4, vec4) in einem Zyklus laufen würde.

Ich sehe, dass ARB says that dot product (DP3 and DP4) and cross product (XPD einzelne Anweisungen sind, aber heißt das, dass diese genauso rechenintensiv sind wie ein vec4 add? Gibt es im Prinzip eine Hardwareimplementierung, die sich an Multiple-Accumulate auf Steroiden anlehnt? Ich kann sehen, wie so etwas in der Computergrafik nützlich ist, aber in einem Zyklus zu tun, was eine ganze Reihe von Anweisungen für sich selbst sein könnte, klingt wie eine Menge.

Antwort

11

Die Frage kann nicht definitiv beantwortet werden. Wie lange ein Vorgang in Hardware dauert, ist nicht nur hardwarespezifisch, sondern auch code-spezifisch. Das heißt, der Umgebungscode kann die Leistung einer Operation vollständig maskieren oder länger dauern.

Im Allgemeinen sollten Sie nicht davon ausgehen, dass ein Skalarprodukt ein Zyklus ist.

Allerdings gibt es bestimmte Aspekte, die sicherlich beantwortet werden können:

Ich habe auch einen Anspruch in den Kommentaren, dass irgendwo gesehen:

eine effizientere Art und Weise zu durchschnittlich vier Werte wären, verglichen zu:

würde ich erwarten, dass dies irgendwie wahr zu sein, so lange wie x, y, z und w in der Tat unterschiedliche float-Werte sind eher als Mitglieder derselben vec4 (das heißt, sie sind nicht value.x, value.y, usw.). Wenn sie Elemente desselben Vektors sind, würde ich sagen, dass jeder ordentliche optimierende Compiler beide zu den gleichen Anweisungen kompilieren sollte. Ein gutes peephole optimizer sollte Muster wie dieses fangen.

Ich sage, dass es "irgendwie wahr" ist, weil es von der Hardware abhängt. Die Dot-Produkt-Version sollte zumindest nicht langsamer sein. Und wiederum, wenn sie Elemente desselben Vektors sind, sollte der Optimierer damit umgehen.

einzelne Anweisungen, aber bedeutet das, dass diese genauso rechenintensiv sind wie eine vec4 add?

Sie sollten nicht davon ausgehen, dass ARB Montag hat jeden Bezug auf den Befehlscode tatsächlichen Hardware-Maschine.

Gibt es im Grunde eine Hardwareimplementierung, die sich an Multiple-Accumulate auf Steroiden anlehnt?

Wenn Sie über Hardware sprechen wollen, ist es sehr Hardware-spezifisch. Es war einmal eine spezialisierte Dot-Produkt-Hardware. Dies war in den Tagen des sogenannten "DOT3 Bumpmapping" und der frühen DX8-Ära der Shader.

Um jedoch die allgemeinen Operationen zu beschleunigen, mussten sie solche Dinge aus dem Weg räumen. Also, für die meisten modernen Hardware (alias: alles Radeon HD-Klasse oder NVIDIA 8xxx oder besser. Sogenannte DX10 oder 11 Hardware), tun Dot-Produkte so ziemlich, was sie sagen, dass sie tun. Jede Multiplikation/Addition nimmt einen Zyklus auf.

Allerdings ermöglicht diese Hardware auch eine Menge Parallelität, so dass Sie 4 separate vec4 Punkt Produkte gleichzeitig passieren können. Jeder würde 4 Zyklen dauern. Aber solange die Ergebnisse dieser Operationen in den anderen nicht verwendet werden, können sie alle parallel ausgeführt werden. Und daher würden die vier von ihnen insgesamt 4 Zyklen benötigen.

Also wieder, es ist sehr kompliziert. Und Hardware-abhängig.

Ihre beste Wette ist, mit etwas zu beginnen, das vernünftig ist. Dann lerne etwas über die Hardware, die du programmieren willst, und arbeite von dort aus.

+0

Ok, danke. "Sie sollten nicht davon ausgehen, dass ARB-Assembly irgendeine Beziehung zu dem tatsächlichen Hardware-Maschinenbefehlscode hat." ist im Grunde die knappe Antwort, auf die ich gehofft hatte. Es scheint einfach so, als wäre ARB eine Nische und es ist schwer, eine Menge Google-fähiges Material zu finden. Dies war eines dieser "Stammeswissen" -Typen, die ich nicht zu überprüfen schien, und die Tatsache, dass es für eine gewisse Zeit wahr war, macht Sinn. Cooles Zeug. – ultramiraculous

0

Der Schlüssel ist, dass ein vec4 in einer einzigen Anweisung "bedient" werden kann (siehe die Arbeit, die Intel bei 16-Byte-Registeroperationen unternahm, auch bekannt als Basis für IOS-beschleunigtes Framework).

Wenn Sie den Vektor splitten und auseinander ziehen, gibt es keine "einzelne Speicheradresse" des Vektors mehr, um den Op auszuführen.

4

Nicol Bolas behandelte die praktische Antwort, aus der Perspektive von "ARB-Assembly" oder Blick auf IR-Dumps. Ich werde die Frage beantworten "Wie können 4 Multiples und 3 fügt ein Zyklus in Hardware sein ?! Das klingt unmöglich.".

Mit schweren Pipelining, jeder Anweisung kann gemacht werden, um einen Zyklus Durchsatz zu haben, egal wie komplex.

Verwechseln Sie das nicht mit einem Latenzzyklus!

Bei vollständiger Pipeline-Ausführung kann eine Anweisung in mehrere Phasen der Pipeline aufgeteilt werden. Alle Stufen der Pipeline arbeiten gleichzeitig.

Jeder Zyklus, die erste Stufe akzeptiert einen neuen Befehl, und seine Ausgänge gehen in die nächste Stufe. Bei jedem Zyklus kommt ein Ergebnis zum Ende der Pipeline.

Betrachten wir ein 4d-Dot-Produkt für einen hypothetischen Kern mit einer multiplen Latenz von 3 Zyklen und einer Additionslatenz von 5 Zyklen.

Wenn diese Pipeline den schlechtesten Weg ohne Vektorparallelität angelegt wäre, wäre es 4 Multiplikationen und 3 Additionen, was insgesamt 12 + 15 Zyklen für eine Gesamtlatenz von 27 Zyklen ergibt.

Bedeutet dies, dass ein Skalarprodukt 27 Zyklen benötigt? Absolut nicht, weil es jeden Zyklus einen neuen beginnen kann, und es erhält die Antwort darauf 27 Zyklen später.

Wenn Sie ein Punktprodukt benötigen und auf die Antwort warten müssen, müssen Sie die volle Latenz von 27 Zyklen für das Ergebnis warten. Wenn Sie jedoch 1000 separate Punktprodukte zur Berechnung hätten, würden Sie 1027 Zyklen benötigen. Die ersten 26 Zyklen, es gab keine Ergebnisse, am 27. Zyklus ist das erste Ergebnis das Ende, nachdem die 1000. Eingabe ausgegeben wurde, dauerte es weitere 26 Zyklen bis die letzten Ergebnisse am Ende waren. Dies führt dazu, dass das Punktprodukt "einen Zyklus" einnimmt.

Echte Prozessoren haben die Arbeit auf verschiedene Arten über die Stufen verteilt, die mehr oder weniger Pipeline-Stufen ergeben, so dass sie völlig andere Zahlen als die oben beschriebenen haben können, aber die Idee bleibt die gleiche. Im Allgemeinen gilt: Je weniger Arbeit Sie pro Stufe ausführen, desto kürzer kann der Taktzyklus werden.

+0

Dies ist eine deskriptiv formulierte Antwort und ich schätze es als solche! –