gcc SSE2/3-Intrinsics
-
Ich muss für ein Projekt versuchen, numerische Algorithmen mittels SSE2 oder SSE3 zu beschleunigen.
Als Compiler wird gcc verwendet. Nun bin ich auf der Suche nach guten Tutorials und geeigneten Intrinsic-Methoden, damit ich das ganze nicht selbst ind Assembler schreiben muss. Leider fand ich bisher nur veraltete Sachen oder Hinweise auf C++ Bibliotheken, die ganze Vektorklassen anbieten.
Bin für jeden brauchbaren Link dankbar.
-
oder Hinweise auf C++ Bibliotheken, die ganze Vektorklassen anbieten.
Weil SSE genau dafuer gedacht ist, nicht nur auf einem Datum zu arbeiten sonder auf vielen gleichzeitig. Beispielsweise unterstuetzt dich http://www.agner.org/optimize/#vectorclass als einfache Kapselung der Intrinsics. Auch ein Blick in die PDFs auf dieser Seite sind lohnenswert.
Ich muss für ein Projekt versuchen, numerische Algorithmen mittels SSE2 oder SSE3 zu beschleunigen.
Das kann alles oder gar nichts bedeuten. Ohne mehr Informationen wirst du nur allgemeine Ratschlaege erhalten. Einer davon ist http://software.intel.com/sites/products/documentation/doclib/ipp_sa/71/ipp_manual/index.htm fuer Signalverarbeitung, Bildverarbeitung, ... Die Funktionen waehlen fuer den jeweiligen Prozessor die beste Implementation. Verfuegbar fuer verschiedene Betriebssysteme/Compiler.
Zum Thema "veraltet": SSE2 wird gerne benutzt, da es meist der kleinste gemeinsame Nenner zwischen aktuellen Prozessoren ist. Darueber hinaus gibt es auch nicht so viele verschiedene Befehle, nur viele Variationen. Ein echter Signalprozessor ist vielseitiger.
-
Es gibt da auch noch das valarray, welches im Prinzip die C++-Standardbibliotheksunterstützung für SIMD-Techniken ist, ohne dass der Standard das Kind direkt beim Namen nennt (man will schließlich den Standard ganz abstrakt für eine virtuelle Maschine forumlieren :p ). Ist sicher nicht geeignet zum Handoptimieren von Algorithmen, aber wollte ich mal erwähnen, da es relativ unbekannt ist. Außerdem kann man dann mal verlgeichen, wie gut der handoptimierte Code gegenüber dieser ziemlich einfach aufgebauten Vektorklasse ist. Letzteres habe ich zwar noch nie ausprobiert, aber ich kann mir gut vorstellen, dass das valarray bei vielen einfachen Problemen überraschend gut abschneiden wird*.
*: Vorausgesetzt die Implementierung ist gut. Lange Zeit wurden valarrays eher als Exot nur stiefmütterlich unterstüzt (valarrays sind eigentlich auf "echte" Vektorprozessoren wie es sie vor 30 Jahren gab ausgelegt, nicht direkt auf SSE). Keine Ahnung wie es beim GCC ist, aber Intel hat in den letzten Jahren Arbeit in valarray gesteckt, um die Möglichkeiten seiner Prozessoren besser auszunutzen.
-
Hier gibt es einen kurzen Artikel über GCCs Auto-Vektorisierung und ein paar Tipps wie man seinen eigenen Code anpassen kann, um dem GCC dabei etwas auf die Sprünge zu helfen und die Generierung unnötigen Codes zu vermeiden.
Eine Einführung in GCCs Intrinsics (inkl. Tarball mit Samplecode) findet sich u.a. auch hier. Hab den Artikel allerdings selbst noch nicht gelesen, sieht aber auf den ersten Blick als Einführung ganz brauchbar aus.