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.
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.
Tags und Links c assembly sse quaternions multiplication