Seite 2 von 2

Re: Geschwindigkeit von Pow

Verfasst: 10.02.2018 17:52
von Mijikai
Mit SSE wäre SdP ohne Pow() vermutlich sogar doppelt so schnell :)

Re: Geschwindigkeit von Pow

Verfasst: 10.02.2018 18:33
von STARGÅTE
Bei solchen Geschwindigkeitstests sollte man auch unbedingt auf den Zeitverbrauch der Schleife selbst achten, sowie die CPU Temperatur.

Zumindest bei mir ist das erste Beispiel "distance = Abs(x0-x1)+Abs(y0-y1)" fast genauso schnell, wie wenn ich diese Zeile auskommentiere und nur die Schleife läuft.

PS: mit SSE ist es nicht schneller:

Code: Alles auswählen

EnableExplicit

Define.d x0,y0,x1,y1
Define distance.d
Define i
Define timer

x0 = 2
y0 = 2
x1 = 7
y1 = 8

OpenConsole("")

timer = ElapsedMilliseconds()
For i = 1 To 100000000
   ! MOVLPD xmm0, [v_x0]
   ! MOVHPD xmm0, [v_y0]
   ! MOVLPD xmm1, [v_x1]
   ! MOVHPD xmm1, [v_y1]
   ! SUBPD  xmm0, xmm1
   ! MULPD  xmm0, xmm0
   ! HADDPD xmm0, xmm1
   ! SQRTSD xmm0, xmm0
   ! MOVSD  [v_distance], xmm0
Next
PrintN("Schätzung: "+distance)
PrintN("Millisecs: "+Str(ElapsedMilliseconds()-timer))


PrintN("")

timer = ElapsedMilliseconds()
For i = 1 To 100000000
   distance = Sqr(((x0-x1)*(x0-x1))+((y0-y1)*(y0-y1)))
Next
PrintN("ohne Pow(): "+distance)
PrintN("Millisecs: "+Str(ElapsedMilliseconds()-timer))



PrintN("")
PrintN("Press ENTER") : Input()

Re: Geschwindigkeit von Pow

Verfasst: 10.02.2018 19:20
von Mijikai
STARGÅTE hat geschrieben:Bei solchen Geschwindigkeitstests sollte man auch unbedingt auf den Zeitverbrauch der Schleife selbst achten, sowie die CPU Temperatur.

Zumindest bei mir ist das erste Beispiel "distance = Abs(x0-x1)+Abs(y0-y1)" fast genauso schnell, wie wenn ich diese Zeile auskommentiere und nur die Schleife läuft.

PS: mit SSE ist es nicht schneller:
...
Vielleicht ist es langsamer wegen den Doubles ?
Wenn ich Floats verwende ist SSE eindeutig schneller.

Code: Alles auswählen

PB1_mit_Pow(): 568.9664306641
Millisecs: 14305

PB2_ohne_Pow(): 568.9664306641
Millisecs: 600

PB3_Abs(): 624.0239868164
Millisecs: 287

SSE (Float): 568.9664306641
Millisecs: 272

SSE_Stargate (Double): 568.9664177928
Millisecs: 1101

Press ENTER