Ich möchte sicherstellen, dass SSE für Arithmetik auf meinen 3D (96 Bit) Float-Vektoren verwendet wird. Ich habe jedoch widersprüchliche Ansichten darüber gelesen, was notwendig ist.SSE-Ausrichtung des 3D-Vektors
Einige Artikel/Beiträge sagen, ich brauche einen 4D Vektor und "Ignoriere" das vierte Element, einige sagen, ich muss meine Klasse mit Dingen wie __declspec(align(16))
dekorieren und überschreiben den new
Operator, und einige sagen, der Compiler ist schlau genug richten Sie die Dinge für mich aus (ich hoffe wirklich, dass das wahr ist!).
ich die Bibliothek Eigen verwende, aber feststellen, dass die „unsupported“ AlignedVector3
Klasse nicht für den Zweck geeignet ist (beispielsweise eine Division durch Null Fehler bei der komponentenweisen Teilung zu tun, enthält lpNorm
Funktion die Dummy vierte Element).
Viele der Artikel, die ich gelesen habe, sind jetzt einige Jahre alt, also hoffe ich, dass moderne Compiler/SSE-Versionen/CPUs nur die Daten für mich ausrichten oder mit nicht 16 Byte ausgerichteten Daten arbeiten können. Jedes aktuelle Wissen darüber wird sehr geschätzt!
CPUs können nicht einfach losgehen und anfangen, die Dinge selbst zu justieren, sie tun nur, was der Code ihnen sagt.Wenn möglich, stoppe diese Idee und benutze stattdessen SIMD über die separaten Koordinaten, so dass du die 4. Spur nicht verschwenden musst (und im Allgemeinen funktioniert fast alles besser so, SIMD-Vektoren sind nicht als Linalg-Vektoren gedacht) – harold
Danke für den Kommentar (verstehe nicht, warum diese Frage abgelehnt wurde ...). Wie auch immer, ich bin nicht sicher, was Sie mit "SIMD über die einzelnen Koordinaten zu verwenden" meinen - meinst du Bulk Verarbeitung mehrerer 3D-Vektoren (das wäre auch cool, wenn es möglich ist)? Ich habe gerade auch den C++ 11 'alignas (16)' Decorator entdeckt. Ich habe es hinzugefügt, um meine generisch-dimensionale Vektorklasse zu umbrechen, und es hat keinen Absturz verursacht - aber natürlich wird kein Proof-SIMD verwendet. – Dave
Ja, Massenverarbeitung, vielleicht 3 Zeiger (x, y, z) in einen Block mit _aligned_malloc. Sie können bei Bedarf auch unausgerichtet laden/speichern. Dieser ganze deklarative Alignment-Deal funktioniert nicht wirklich gut in C++ - Sachen, zum Beispiel, wenn Sie diesen Typ in einen Container setzen, wird er immernoch brechen, wenn Sie nicht einen benutzerdefinierten Allocator verwenden. – harold