Verfasst: 03.08.2007 14:28
boahZeHa hat geschrieben:es ist föllig egal![]()
Sowas ist mir aber nicht egal

@Didi
yo sorry, den absatz hab ich wohl überlesen...
Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
boahZeHa hat geschrieben:es ist föllig egal![]()
Sowas ist mir aber nicht egal
Wäre aber wohl nur für einen zur Compilezeit feststehenden Exponenten von 2, vielleicht noch 3 oder 4 sinnig.DarkDragon hat geschrieben:... wenn PB intelligent wäre würde es auch Pow als Compiler-Inside-Makro halten und es ersetzen ...
Code: Alles auswählen
;- Achtung! Benötigt eine CPU, die mit SSE3 etwas anfangen kann!
Global PosX1.f=300
Global PosX2.f=400
Global PosY1.f=750
Global PosY2.f=900
Global Result1.f
Global Result2.f
Global Result3.f
Macro DistancePow()
Result1=Sqr(Pow(PosX1-PosX2,2)+Pow(PosY1-PosY2,2))
EndMacro
Macro DistanceMul()
Result2=Sqr(((PosX1-PosX2)*(PosX1-PosX2))+((PosY1-PosY2)*(PosY1-PosY2)))
EndMacro
Macro DistanceSSE3() ;benötigt SSE3
!movupd xmm0,dqword[v_PosX1]
!hsubps xmm0,xmm0
!mulps xmm0,xmm0
!haddps xmm0,xmm0
!sqrtss xmm0,xmm0
;!rsqrtss xmm0,xmm0 ;kann sqrtss ersetzen, wenn´s nicht so genau sein muß
;!rcpss xmm0,xmm0
!movss dword[v_Result3],xmm0
EndMacro
T1=GetTickCount_()
For t=1 To 10000000
DistancePow()
Next
T1=GetTickCount_()-T1
Str1$="PB mit Potenzierung : "+StrF(Result1)+" Zeit : "+Str(T1)+" ms"
T2=GetTickCount_()
For t=1 To 10000000
DistanceMul()
Next
T2=GetTickCount_()-T2
Str2$="PB mit Multiplikation : "+StrF(Result2)+" Zeit : "+Str(T2)+" ms"
T3=GetTickCount_()
For t=1 To 10000000
DistanceSSE3()
Next
T3=GetTickCount_()-T3
Str3$="PB mit SSE3 : "+StrF(Result3)+" Zeit : "+Str(T3)+" ms"
MessageRequester("Distance",Str1$+#LFCR$+Str2$+#LFCR$+Str3$)
Auha ... mein Athlon64 3200+ scheint wohl nicht dazu zu gehören.Helle hat geschrieben:... folgendes Beispiel mit SSE3 (Achtung! Entsprechende CPU muß vorhanden sein!).
Jo ... der gute A64 3200+ ist zwar schon etwas in die "Jahre" gekommen aber für meinen alten Sockel-754 lohnt sich eine Aufrüstung nicht mehr wirklich.Helle hat geschrieben:Jaja, der gute alte Athlon64 3200+! Hab ich auch seit Ende 2003 genutzt, aber inzwischen durch einen Sempron mit SSE3 und geringerer Wärme-Entwicklung ersetzt (knapp 60 Euronen).
Ahh ... hatte mich schon über das "dqword[]" gewundert.Helle hat geschrieben:Zum Code: Die erste Zeile liest ein Double-Quad-Word ein, also alle 4 Werte auf einmal.
Naja ... ist dann halt wirklich eine extrem spezielle Variante eines Distance()-Macros, da vermutlich ja nur sehr selten die X/Y-Werte von 2 zu vergleichenden Punkten direkt im Speicher hintereinander liegen werden.Helle hat geschrieben:Wichtig ist dabei natürlich die "richtige" Reihenfolge der Variablen.
Code: Alles auswählen
Macro Distance(x1,y2,x2,y2)
...
EndMacro
das ist ein nicht zu unterschätzender punkt.Kaeru Gaman hat geschrieben:2.) wenn man distanzen vergleichen will, kann man sich bei beiden das wurzelziehen sparen.
dann verwendet man gleich D2 zum vergleichen, der rest des algorithmus entfällt.
Code: Alles auswählen
If Sqr(DX*DX+DY*DY) < A
Code: Alles auswählen
If DX*DX+DY*DY < A*A
Code: Alles auswählen
Macro DistanceMul(PosX1,PosY1,PosX2,PosY1)
Sqr(((PosX1-PosX2)*(PosX1-PosX2))+((PosY1-PosY2)*(PosY1-PosY2)))
EndMacro
Code: Alles auswählen
Result2 = DistanceMul(PosX1,PosY1,PosX2,PosY1)
Code: Alles auswählen
Macro DistanceMul(PosX1,PosY1,PosX2,PosY1,Result)
DX = (PosX1-PosX2)
DY = (PosY1-PosY2)
Result = Sqr(DX*DX+DY*DY)
EndMacro
Code: Alles auswählen
DistanceMul(PosX1,PosY1,PosX2,PosY1,Result)
nur dann, wenn man in nachfolgenden berechnungen die berechnung von DX mehr als einmal aufrufen müsste.Scarabol hat geschrieben:Bringt das wirklich was die Werte in Variablen (DX, DY) zu speichern?
Code: Alles auswählen
If DX*DX+DY*DY < A*A