2009-03-19 16 views
53

Gibt es ein einfaches Tutorial für mich, um in SSE, SSE2 und SSE3 in GNU C++ auf Hochtouren zu kommen? Wie können Sie Code-Optimierung in SSE tun?SSE SSE2 und SSE3 für GNU C++

+4

ich eine Bibliothek schrieb SSE2 Optimierungen leicht zu machen - https://github.com/LiraNuna/glsl -sse2 – LiraNuna

+0

Ich fand dies [Blog-Post] (http://minchechiu.blogspot.com/2009/05/sse.html) mit vielen hochwertigen Links auf SSE. – Philip

+0

Ich fand ein interessantes Dokument hier: http://ds9a.nl/gcc-simd/index.html –

Antwort

57

Tut mir leid, ich kenne kein Tutorial.

Ihre beste Wette (IMHO) besteht darin, SSE über die "intrinsischen" Funktionen zu verwenden, die Intel bietet, um (allgemein) einzelne SSE-Anweisungen einzubinden. Diese werden über eine Reihe von Include-Dateien mit dem Namen * mmintrin.h zur Verfügung gestellt, z. B. xmmintrin.h ist der ursprüngliche SSE-Befehlssatz.

Beginnen Sie vertraut mit den Inhalten der Intel Optimierung Reference Manual ist eine gute Idee (siehe Abschnitt 4.3.1.2 für ein Beispiel von intrinsics) und die SIMD-Abschnitte sind wesentliche Lesung. Die Referenzhandbücher für den Befehlssatz sind ebenfalls sehr hilfreich, da die Dokumentation jedes Befehls die zugehörige "intrinsische" Funktion enthält.

Sie verbringen einige Zeit den Assembler vom Compiler aus intrinsics erzeugt Inspektion und Profilierung/Leistungsmessung (Sie werden eine Menge lernen) (Sie vermeiden, wenig Rendite der Aufwand Zeit SSE-ing Code verschwenden).

-Update 2011-05-31: Es gibt einige sehr schöne Abdeckung von Spezifika und Vektorisierung in Agner Fog optimization PDFs (thanks), obwohl es ein wenig Verbreitung über (zB Abschnitt 12 des first one und Abschnitt 5 des second one) ist . Dies sind nicht gerade Tutorial-Material (in der Tat gibt es eine Warnung "diese Handbücher sind nicht für Anfänger"), aber sie behandeln SIMD (ob über Asm, intrinsics oder Compiler-Vektorisierung verwendet) zu Recht als nur ein Teil der größeren Optimierung Toolbox.

Update 2012-10-04: Ein nice little Linux Journal article auf gcc Vektor intrinsics verdient eine Erwähnung hier. Allgemeiner als nur SSE (deckt auch PPC- und ARM-Erweiterungen ab). Es gibt eine gute Sammlung von Referenzen auf der last page, die mich auf Intels "intrinsics manual" aufmerksam gemacht hat.

8

Überprüfen Sie die Optionen -mtune und -march, -mss * und -mfpmath natürlich. All dies ermöglicht GCC, SSE-spezifische Optimierungen durchzuführen.

Alles darüber hinaus ist das Reich von Assembler, fürchte ich.

GCC Online Manual - i386 and x86_64 Options

+5

Kein Assembler benötigt. GCC hat Erweiterungen, um spezielle Datentypen und "Funktionsaufrufe" für die Verwendung von MMX/SSE zu unterstützen. –

+1

Zugegeben, das sind dünn verkleidete Wrapper für die Assembly. Wenn Sie also SSE nicht in Asm programmieren können, werden Ihnen die Erweiterungen nicht viel helfen. –

+7

Eigentlich sind intrinsics mehr als nur Wrapper um Assembly. Sie ermöglichen dem Compiler, den Code für maximale Leistung neu anzuordnen. Aber Sie müssen gut verstehen, wie SIMD funktioniert. –

1

Ein einfaches Tutorial? Nicht, dass ich davon Wüste.

Aber alle Informationen über die Verwendung von MMX oder einer beliebigen Version von SSE sind nützlich für das Lernen, ob für GCC oder für ICC oder VC.

Um mehr über die Vektorerweiterungen von GCC zu erfahren, geben Sie "info gcc" ein und gehen Sie zu Node: Vector Extensions.

19

Die einfachste zu verwendende Optimierung besteht darin, dass gcc SSE-Code ausgibt.

Flags: -msse, -msse2, -msse3, -march =, -mfpmath = sse

Für eine kurze Liste über 386 Optionen finden http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options, genauere Dokumentation für Ihre spezifische Compiler-Version gibt es: http://gcc.gnu.org/onlinedocs/.

Zur Optimierung immer Agner Fogs: http://agner.org/optimize/.Ich denke, er hat keine SSE-Tutorials für intrinsics, aber er hat einige wirklich ordentliche std-C++ - Tricks und bietet auch viele Informationen über die Codierung von SSE-Assembly (die oft in intrinsics transkribiert werden kann).

+0

'-mftree-vectorize' gibt auch SSE aus. – LiraNuna

+2

Nicht unbedingt. Aus dem Handbuch: "Loop-Vektorisierung auf Bäumen durchführen. Dieses Flag ist standardmäßig bei -O3 aktiviert." Also das Flag selbst erwähnt keine bestimmte Plattform (könnte auch mehrere Bytes in 32-Bit-Standardregistern verarbeiten). –

3

MSDN hat eine ziemlich gute Beschreibung von SSE-Compiler-Einbauten (und diese eingebauten sind De-facto-Standard, sie funktionieren sogar in Clang/XCode).

Das Schöne an dieser Referenz ist, daß sie äquivalent Pseudo-Code zeigt, so z.B. Sie können lernen, dass ADDPD Anweisung:

r0 := a0 + b0 
r1 := a1 + b1 

Und hier ist eine gute Beschreibung einer kryptischen Shuffle Anweisung: http://www.songho.ca/misc/sse/sse.html

Verwandte Themen