Seite 1 von 1

SSE Zeitvergleich

Verfasst: 8. Nov 2014 02:13
von AlexPi11
Ich würde gerne einen Laufzeiten Vergleichs-Thread starten, um einschätzen zu können wie gut/schlecht die eigenen Werte denn nun sind.

Bei win32:
SSE2: 1.1 schneller (vor Edit: 1.14 langsamer)
SSE4: 1.2 schneller

Bei 64bit (hier tut sich bei SSE4 nochmal ordentlich was):
SSE2: 1.15 schneller (vor Edit: 1.2 langsamer)
SSE4: 1.34 schneller

Bin gespannt was ihr so habt. :?:

Edit: Neue SSE2 Werte dank weiterer Optimierung.

Re: SSE Zeitvergleich

Verfasst: 8. Nov 2014 11:19
von RobDangerous
Exquisite Idee.
Aber nicht, dass wir uns falsch verstehen - SSE-Optimierungen sollen manuell durchgeführt werden, wie in der Folie, auf die das Übungsblatt verweist.

Re: SSE Zeitvergleich

Verfasst: 9. Nov 2014 15:39
von Dennis Wandschura
64bit, SSE2, O3, Intel v15.0 Compiler
bei mir habe ich eine verbesserung von ~2x mit SIMD multiplikation im vergleich zur float multiplikation.

alle werte in den matrizen sind zufallsgeneriert.

Re: SSE Zeitvergleich

Verfasst: 9. Nov 2014 17:08
von Sascha-Thorsten
bei mir ist sse um Faktor 2,5 schneller als die normale float variante auf einem 64 bit ubuntu auf einem Core i5 2500k

gcc -march=native -O2

alle Werte in der Matrix sind wie bei Dennis zufallsgeneriert

Re: SSE Zeitvergleich

Verfasst: 9. Nov 2014 23:19
von Dennis Wandschura
Sascha-Thorsten hat geschrieben:bei mir ist sse um Faktor 2,5 schneller als die normale float variante auf einem 64 bit ubuntu auf einem Core i5 2500k

gcc -march=native -O2

alle Werte in der Matrix sind wie bei Dennis zufallsgeneriert
warum is bei mir langsamer :(

hab nochma den SIMD teil bissl optimiert XD
ca. 9% - 10% schneller.

Re: SSE Zeitvergleich

Verfasst: 10. Nov 2014 00:42
von Sascha-Thorsten
Der Code kann langsamer werden, wenn man iden Compiler anweist, mehr optimierungen durchzuführen. Ich hab das ganze jetzt mit -O3 gemacht und ich hatte tatsächlich ein wenig langsameren Code bekommen, da er bei O3 auch Optimierungen durchführt, die den Code größer machen können.

Re: SSE Zeitvergleich

Verfasst: 10. Nov 2014 11:11
von AlexPi11
Hab' mich nochmal drangesetzt, nachdem unsere Werte so nachhinken

Leider hat sich nur etwas bei der SSE2 Variante getan:
64bit, O2, MSVC, 1.4 mal schneller :? [Edit: neuer Wert]

Mehr Sorgen macht mir momentan aber nun, dass die SS4 Variante, genauer: _mm_dp_ps, bei mir zu unterschiedlichen Ergebnissen so ab der achten Ziffer führt. :!:

[Edit:]
SSE4 64bit: 1.54 mal schneller

Re: SSE Zeitvergleich

Verfasst: 10. Nov 2014 15:11
von Dennis Wandschura
AlexPi11 hat geschrieben:Hab' mich nochmal drangesetzt, nachdem unsere Werte so nachhinken

Leider hat sich nur etwas bei der SSE2 Variante getan:
64bit, O2, MSVC, 1.27 mal schneller :?

Mehr Sorgen macht mir momentan aber nun, dass die SS4 Variante, genauer: _mm_dp_ps, bei mir zu unterschiedlichen Ergebnissen so ab der achten Ziffer führt. :!:
bei floating point sind doch rundungsfehler normal-

Re: SSE Zeitvergleich

Verfasst: 10. Nov 2014 16:23
von AlexPi11
Ja das schon. Aber bei gleichen Input sollte schon immer das gleiche rauskommen.
Also denke ich mal, dass die Reihenfolge der Multiplikationen/Addition anders ist (oder vll anders gerundet wird?) bei _mm_dp_ps.

Bei Größenordnung 10^10 ist der Unterschied z.B. schon in der Ordnung 100. Und so Ergebnisse erhält man ja schon bei Inputgrößen um die 10^5.

Naja wir benutzten nun einfach SSE2; das stimmt mit der normalen Variante überein. Schade nur das sich zeitlich bei uns wohl erstmal nichts mehr tut.

Re: SSE Zeitvergleich

Verfasst: 10. Nov 2014 22:05
von simon.r
Weil bisher noch niemand dazu etwas geschrieben hat: Wie viele Iterationen habt ihr für eure Messungen jeweils durchgeführt?

Zum Intel Compiler: http://www.agner.org/optimize/blog/read.php?i=49#49

Re: SSE Zeitvergleich

Verfasst: 10. Nov 2014 23:20
von simon.r
Unsere Speedup-Ergebnisse, jeweils 1000000 Matrixmultiplikationen, Win7 64Bit, Core i5-2400:

MSVC2012:
Win32:
SSE2: 1.32
SSE4: 1.64

x64:
SSE2: 1.16
SSE4: 1.63


GCC 4.8.1 (i686-w64-mingw32), march=native:
O2:
SSE2: 2.12
SSE4: 2.28
Hinweis: Der Speedup ist hier sehr trügerisch und kommt dadurch zu stande, dass die reguläre Variante nur einen absoluten Wert von 0.058199 erreicht! MSVC kommt hier auf 0.044543 bzw. 0.037944. Vermutlich erklären sich auch so die von anderen berichteten Speedups jenseits der 2.0!

O3:
SSE2: 0.87
SSE4: 1.97
-> Hier ist wohl der Vektorisierer von gcc angesprungen und hat deutlich performanteren Code als die manuellen SSE2 Intrinsics erzeugt.

Re: SSE Zeitvergleich

Verfasst: 13. Nov 2014 21:24
von Dennis Wandschura
ich habe 1000000 iterationen gemacht.
für eine einzelne multiplikation ergeben sich dann für mich folgende werte:
FLOAT: 0.000022 ms
SIMD: 0.000011 ms