Wie multipliziert man zwei Quaternionen mit minimalen Anweisungen?

8

Nach einigem Nachdenken kam ich mit dem folgenden Code zum Multiplizieren von zwei Quaternionen mit SSE:

%Vor%

Ich habe erwartet, dass die Assembly eine minimale Menge an Anweisungen hat. Wenn ich es jedoch mit gcc -msse3 -S in Assembly kompiliere, enthält die resultierende Funktion 67 Anweisungen:

%Vor%

Was mache ich falsch? Es gibt eine bessere Möglichkeit, die Elemente zu mischen, ohne so viele movaps -Anweisungen zu verwenden.

    
Guilherme 30.08.2013, 23:32
quelle

2 Antworten

3

Macht nichts. Wenn ich stattdessen den Code mit gcc -msse3 -O1 -S kompiliere, bekomme ich Folgendes:

%Vor%

Das sind jetzt nur noch 18 Anweisungen. Das habe ich am Anfang erwartet. Hoppla!

    
Guilherme 30.08.2013, 23:41
quelle
2

Sie könnten an der C ++ - Vektorklassenbibliothek von Agner Fog interessiert sein. Es bietet eine Quaternion4f und Quaternion4d Klassen (einschließlich * und *= Operatoren, natürlich), implementiert mit SSE2 und AVX Befehlssätze. Da es sich bei der Bibliothek um ein Open Source-Projekt handelt, können Sie in den Code eintauchen und ein gutes Implementierungsbeispiel finden, um Ihre Funktion zu erstellen.

Später können Sie das Handbuch "Optimieren von Subroutinen in der Assemblersprache" konsultieren und eine optimierte, reine Version bereitstellen Assembly-Implementierung der Funktion oder, während bewusst einige Low-Level-Tricks, versuchen, die intrinsics Ansatz in C neu zu gestalten.

    
Krzysztof Abramowicz 31.08.2013 16:57
quelle