Benchmarking von High Performance code. wie macht man es richtig?



  • Und SSE kann Programme deutlich schneller machen. Diese Aussagen schliessen sich nicht aus.



  • Mal ne andere Frage die nur z.T. dazupasst: wie tut SSE eigentlich mit Denormals?
    Gleich wie die die x87 (=software interrupt=laaaaaaangsam), oder wird da auf Denormals einfach verzichtet?



  • hustbaer schrieb:

    Mal ne andere Frage die nur z.T. dazupasst: wie tut SSE eigentlich mit Denormals?
    Gleich wie die die x87 (=software interrupt=laaaaaaangsam), oder wird da auf Denormals einfach verzichtet?

    auf x87 kannst du zwischen normalisieren und exception waehlen, auf sse zwischen flush to zero (bzw denormals are zero) oder die hardware handled die exception, was aber nicht schneller ist als eine software exception.



  • Powerpaule schrieb:

    Dazu möchte ich schonmal anmerken, dass du dir da nicht allzu große Hoffnungen machen darfst - SSE bringt unter Umständen nix oder macht es sogar langsamer (da du erstmal die Werte in extra Register kopieren musst, heutige Prozessoren sind aber im Rechnen an sich schon so schnell, dass sich das dann teilweise kaum noch lohnt.

    man muss es natuerlich richtig machen, man kann so ziemlich alles falsch anwenden, was glaubst du wie langsam eine GPU ist wenn du ihr eine 4x4 matrix multiplikation gibst 😉

    Ich habe selber vor Kurzem eine Matrix-Klasse geschrieben, und da auch versucht mit SSE zu verbessern. Es hat fast überhaupt nichts gebracht. Die 64-Bit-Version ist mit SSE sogar deutlich langsamer. Oder besser gesagt, im normalen Modus (ohne SSE) ist der gleiche Code als 64-Bit-Programm ca. 60% schneller gewesen - ich vermute mal, das liegt daran dass der Compiler (Visual Studio) dann schlau genug ist die Sache so zu optimieren dass er pro Takt 2 float-Werte holen kann, statt einem. Die Multiplikationen an sich sind ja ein Klacks. Du hast natürlich Potenzen drin, da ist es vielleicht noch etwas anders. SSE bringt ja umso mehr, je komplexer die Berechnungen werden. Oder AVX ; )

    ich hoffe dir ist klar, dass unter 64bit ausschliesslich SSE benutzt wird, windows unterstuetzt keine fpu (ist bei linux anders, aber du sprichst ja von visual studio).
    wenn also deine SSE implementierung langsammer ist als die vom compiler generierte SSE implementierung, liegt es unmoeglich an SSE.

    Edit: Ich muss auch noch anmerken dass ich das Ganze nur auf einem relativ guten Prozessor (Core i5 2500) getestet habe, aber ich denke die Tendenz ist klar.^^

    gerade auf i7 prozessoren, sollte SSE bei der matrix multiplikation gut sein, da frueher shuffle und unaligned read recht teuer war, beides ist nun so schnell es geht, sprich, unaligned load auf eine aligned addresse ist so schnell wie ein aligned read und wenn du genausoviele schuffel instructions wie arithmetische instruction hast, sollten sie nicht auffallen, weil sie parallel in einer anderen pipe gleich schnell abgearbeitet werden und du somit eigentlich nicht langsammer sein solltest als mit der fpu (eben weil du mit unaligned reads und single muls+adds genau dasselbe machen kannst wie die fpu).

    also sse, auf i7 ist wirklich top, sowas wie Sin/Cos ist zwar an sich langsammer, aber dafuer kann man 2/4 bzw 8mit AVX gleichzeitig berechnen und insgesammt bist du dann schneller. (und schuffle, um register als temporaere speicher zu benutzen sind auch um einiges schneller als L1 reads, was also 64float register bedeutet!)

    also ich glaube du solltest deinem matrix mul nochmal eine chance geben 😉



  • rapso schrieb:

    ich hoffe dir ist klar, dass unter 64bit ausschliesslich SSE benutzt wird, windows unterstuetzt keine fpu (ist bei linux anders, aber du sprichst ja von visual studio).
    wenn also deine SSE implementierung langsammer ist als die vom compiler generierte SSE implementierung, liegt es unmoeglich an SSE.

    Hm, nein, das war mir so nicht klar... D.h. Visual Studio optimiert es dann auch wenn möglich gleich dahingehend, dass mehrere Mutliplikationen/Additionen mit einem Mal ausgeführt werden? Wenn nicht wäre es wirklich etwas seltsam warum die SSE-Implementierung vom Compiler schneller ist...
    Ich hatte es ja erst unter 32 Bit probiert, dort war SSE teilweise auch noch schneller (bei Vektor*Matrix hatte es noch einiges gebracht, ca. 25%, bei Matrix*Matrix war es dann schon fast nutzlos oder etwas langsamer) - das Gleiche unter 64Bit war dann deutlich langsamer als die Variante ohne eigenes SSE, weshalb ich davon ausging dass es dort dann keinen Sinn mehr hat (ich wollte ursprünglich dann noch AVX testen, hatte dann aber keine Lust mehr^^). Letztendlich hab ich mich dann auch nicht weiter genauer damit beschäftigt, weil ich nur mal interessehalber grob sehen wollte was man damit rausholen könnte. Ich wollte dann nur noch wissen, was daran eigentlich am langsamsten war, und das waren halt wie zu erwarten die Kopiervorgänge in die Register.
    Na ja, vielleicht setze ich mich nochmal ran, je mehr Nanosekunden man rausholen kann, umso besser ; )


Anmelden zum Antworten