2016-07-07 23 views
0

C++ Eigen-Bibliothek tut Vektorisierung für andere Architektur, wie SSE, NEON usw. In ihrer Dokumentation erwähnten sie, dass Eigen-Vektorisierung nicht compilerabhängig ist. Aber die meisten modernen Compiler wie gcc tun die Vektorisierung automatisch, wenn das Vektorisierungsflag mit dem -O3-Flag aktiviert ist.Warum benötigen Bibliotheken hart codierte vektorizion anstelle von Compiler-Auto-Vektorisierung

Also meine Frage ist, warum Eigen oder andere Bibliotheken hartcodierte Vektorisierung macht, wenn Compiler dies automatisch für uns tut?

+1

Vielleicht vertrauen sie den Compilern nicht so sehr wie Ihnen. Oder, wie Sie selbst sagten, * "die meisten modernen Compiler wie gcc tun die Vektorisierung automatisch" * - vielleicht ist das meiste nicht gut genug. –

+1

Die Bibliothek gibt es schon lange, Version 2.0 stammt aus dem Frühjahr 2009 und verwendete bereits SSE2-Code. Compiler waren damals nicht zurück. –

+1

Wenn Sie die Quelle überprüfen, sehen Sie, dass dort eine Menge Sachen sind, die einfach nicht autovektorisiert werden würden. – harold

Antwort

2

Es ist wahr, dass Compiler bei Auto-Vektorisierung immer besser werden, und für grundlegende Koeffizienten-Operationen wie 2 * A-4 * B kann eine Bibliothek wie Eigen nicht viel besser als die letzten Compiler. Für etwas kompliziertere Ausdrücke wie Matrixprodukte, Reduktionen, Transposition, Potenzen usw. kann der Compiler jedoch nicht viel tun. Auf der anderen Seite kann Eigen die höhere Kenntnis der Ausdruckssemantik nutzen, um sie explizit zu vektorisieren. Außerdem werden komplexe Skalartypen von Compilern nicht vektorisiert. Sie können dies selbst überprüfen, indem Sie die explizite Vektorisierung von Eigen deaktivieren (-DEIGEN_DONT_VECTORIZE).