Was ist der beste Weg, um ein Array von 3D-Vektoren zu implementieren?

9

Ich habe beschlossen, Eigen in meinem Projekt zu verwenden. Aus der Dokumentation ist jedoch nicht ersichtlich, wie am effizientesten ein Array von 3D-Vektoren spezifiziert werden sollte.

Wie ich schon sagte, ist der erste Weg

%Vor%

Aber in diesem Fall, wie sollte ich ein anderes Array bekommen, dessen Elemente skalaren Produkten von Elementen von array_of_v3d und einigen anderen Instanzen von Vector3d entsprechen? Mit anderen Worten, kann ich die folgende Schleife mit den Funktionen Eigen neu schreiben:

%Vor%

Der zweite Weg besteht darin, eine Matrix mit der Größe (3 x size) oder (size x 3) zu verwenden. Zum Beispiel kann ich es so erklären:

%Vor%

Aber ich habe aus der Dokumentation nicht erfahren, wie man die Anzahl der Spalten einstellt. Folgendes scheint zu funktionieren, aber ich muss die Anzahl der Zeilen 3 zweimal wiederholen:

%Vor%

Dann ist die obige Schleife äquivalent zu

%Vor%

Wie meine Experimente gezeigt haben, ist das ein bisschen schneller als

%Vor%

Zusätzlich:

Wie auch immer, meine Verwendung von Eigen scheint nicht so optimal zu sein, da das gleiche Programm in plain C fast 1,5 mal schneller ist (es ist nicht wahr, es hängt von size ab):

%Vor%

Habe ich etwas verpasst? Gibt es einen anderen Weg im Rahmen von Eigen library, um mein Problem zu lösen?

Aktualisierung:

Hier präsentiere ich Ergebnisse meiner Tests. Es gibt 5 Fälle:

  1. C -style für die Schleife, die teilweise abgerollt wird
  2. Eigen::Matrix ( rows x cols = 3 x size ). In diesem Fall werden Werte von 3D-Vektoren zusammen im Speicher gespeichert, da Eigen standardmäßig Daten in der Spalte-Hauptspeicher speichert. Oder ich könnte Eigen::RowMajor und alles andere wie im nächsten Fall einstellen.
  3. Eigen::Matrix ( rows x cols = size x 3 ).
  4. Hier wird jede Komponente des 3D-Vektors in einem separaten VectorXd gespeichert. Also gibt es drei VectorXd-Objekte, die auf Vector3d zusammengefügt werden.
  5. Ein std::vector Container wird verwendet, um Vector3d Objekte zu speichern.

Dies ist mein Testprogramm

%Vor%

Das Programm wurde von gcc 4.6 mit den Optionen -march=native -O2 -msse2 -mfpmath=sse kompiliert. Auf meinem Athlon 64 X2 4600+ habe ich einen schönen Tisch bekommen:

%Vor%

Die Tabelle zeigt, dass gute Darstellungen eines Arrays von 3D-Vektoren Matrix (Komponenten von 3D-Vektoren sollten zusammen gespeichert werden) und std::vector von Objekten mit fester Größe Vector3d . Dies bestätigt Jakobs Antwort. Für große Vektoren zeigt Eigen tatsächlich gute Ergebnisse.

    
Oleg Zhyan 21.10.2012, 13:51
quelle

1 Antwort

3

Wenn Sie nur ein Array von Vector3d -Objekten halten wollen, ist die Verwendung von std::vector in Ordnung, obwohl Sie sich der Ausrichtung Probleme.

Die zweite Methode, die Sie beschreiben, die eine size x 3 -Matrix verwendet, ist ebenfalls sehr praktikabel und normalerweise der schnellere Weg. Ich bin mir nicht sicher, ob Sie eine Frage zu diesem Thema stellen, abgesehen von der Frage der Leistung.

Was die Performance anbelangt, gehe ich davon aus, dass Sie in Ihrem Compiler die vollständige Optimierung verwendet haben, da Eigen nicht gut läuft, wenn die Optimierung ausgeschaltet ist. In jedem Fall können Sie möglicherweise etwas Leistung erzielen, indem Sie ausgerichtete Typen verwenden , die mit optimierten SIMD-Anweisungen verarbeitet werden können. Eigen sollte dies automatisch tun, wenn Sie z. Vector4d stattdessen.

    
Jakob 22.10.2012, 08:54
quelle

Tags und Links