SSE2 Optimierung mit Intrinsics



  • Hi Leute

    ich habe VectorOperationen ( keine Mathematik, nur Logikverküpfungen und Vergleiche ), die ich massenhaft durchführen muss.

    Daher habe ich mir die Intrinsics für SSE2 angeschaut.
    Hier z.B. gibts eine Übersicht:

    http://www.univ-orleans.fr/lifo/Members/Sylvain.Jubertie/doc/SIMD/html/group___s_s_ecomparisonops.html

    Macht das aus eurer Sicht Sinn, dort Gedanken in Alignments und co zu investieren?

    Oder ist die Compiler-Interne Optimierung über die Option "-march=xy" gut genug, so dass sich weitere Aufwände für händische Optimierungen im Quellcode da im Prinzip nicht auszahlen würden?



  • Nach eigenen Erfahrungen lassen die Auto Vectorizer in den Compilern momentan noch zu wünschen übrig. Getestet hatte ich das mal mit dem Intel Compiler (GCC wird da wohl nicht besser ausfallen) für die Xeon Phi Architektur mit 512 Bit großen Vektoreinheiten. Für einfache Schleifen und mit den entsprechenden Hinweisen für den Compiler (Aliasing, Alignment, etc.) mag das noch hinhauen aber für kompliziertere Sachen war das dann nicht so super. Ich habe dann alles von Hand mit Instrinsics programmiert und das Ergebniss war deutlich schneller. Ob sich der Aufwand lohnt musst du für dein Projekt selbst entscheiden. Bei mir hat es einen großen Unterschied gemacht ob die Simulation 1 Woche oder 1 Monat dauert.



  • It0101 schrieb:

    http://www.univ-orleans.fr/lifo/Members/Sylvain.Jubertie/doc/SIMD/html/group___s_s_ecomparisonops.html

    Macht das aus eurer Sicht Sinn, dort Gedanken in Alignments und co zu investieren?

    Oder ist die Compiler-Interne Optimierung über die Option "-march=xy" gut genug, so dass sich weitere Aufwände für händische Optimierungen im Quellcode da im Prinzip nicht auszahlen würden?

    Hi,

    ich wollte dich eigentlich nur auf eine deutlich informativere Referenz für solche Intrinsics auf x86-basierten Systemen hinweisen:

    https://software.intel.com/sites/landingpage/IntrinsicsGuide/#cats=Compare&techs=SSE,SSE2

    Ob sich das letztendlich lohnt, kann man wohl nur nur sagen, wenn man es mal ausprobiert hat - vielleicht erstmal testweise für ein kleineres Teilproblem, bevor man zu viel Arbeit reinsteckt.
    Aus dem Bauch heraus würde ich mich sebi707 anschließen und sagen, dass es sich für komplexere Berechnungen durchaus lohnt. Bei simpleren Sachen - z.B. jeweils eine einzelne Operation,
    die man in einer Schleife elementweise auf zwei Arrays durchführt, würde ich davon ausgehen, dass der Compiler das durchaus hinbekommt.

    Das wichtigste bei solchen "massenhafen Operationen" dürfte jedoch zunächst einmal sein, dass die Daten, die du da verwurstest, in der Verarbeitungsreihenfolge zusammenhängend im Speicher liegen,
    um möglichst optimal vom CPU-Cache zu profitieren. Wenn das nicht der Fall ist, z.B. die Objekte induividuell auf dem Heap angelegt wurden, oder (bei einem zusammenhängenden Array) die Klassen-Member,
    auf denen die Operation durchgeführt wird, zu weit auseinander liegen (z.B. weil sich dazwischen noch andere Member befinden, die für die Operation nicht benötigt werden) werden solche Optimierungen
    wahrscheinlich keinen Unterschied machen, da die CPU dann die meiste Zeit damit beschäftigt ist, auf den Arbeitsspeicher zu warten.
    (letzten Absatz bitte ignorieren, falls das bereits berücksichtigt wurde ;))

    Gruss,
    Finnegan


Log in to reply