Seite 2 von 3
Re: Optimierung für Sqr(a²+b²) ?
Verfasst: 30.07.2011 15:36
von DarkDragon
Es kommt darauf an, ob der Call in einer Bedingung steckt, denn das beeinflusst den
Prefetcher. Ansonsten ist die Optimierung von NicTheQuick die übliche.
Re: Optimierung für Sqr(a²+b²) ?
Verfasst: 30.07.2011 17:56
von alter Mann
falls es nicht zu genau sein muss kann man für die Wurzel Pf=Sqr(PX*PX+PY*PY) auch folgendes benutzen (max. Fehler rund 6 %)
Code: Alles auswählen
If PX > PY
Pf = PX+PY*PY/PX*0.5
Else
Pf = PY+PX*PX/PY*0.5
EndIF
Re: Optimierung für Sqr(a²+b²) ?
Verfasst: 31.07.2011 15:50
von Thorium
STARGÅTE hat geschrieben:@Thorium
Im vergleich zu den Berechungen selbst, ist das aufrufen eins Calls sehr schnell.
Das selber rummalem mit Pointer bringt keinen Vorteil, weil die Berechnungen bleiben.
Es bringt garantiert einen Vorteil.
Nach meiner Erfahrung bringt bei Bildverarbeitung jeder Cycle den man spart was. Spart man den Callback weg, spart man sich den Call und die Pushes der Parameter weg. Zudem sind weitere Optimierungen möglich, wie pro Schleifendurchlauf mehrere Pixel zu verarbeiten anstatt nur einen.
Re: Optimierung für Sqr(a²+b²) ?
Verfasst: 31.07.2011 16:36
von STARGÅTE
Ich gebe dir ja recht, das jeder CustomFilterCallback mit eigenen Mitteln schneller ist, nur um wie viel er schneller ist, hängt wirklich davon ab, was du im Endeffekt rechnest.
Und gerade beim Kreis, kann man sich ja 7/8 berechnungen sparen, wenn man die Symmetrie ausnutzt und immer gleich 8 Pixel plottet, das aber nur am Rande.
Re: Optimierung für Sqr(a²+b²) ?
Verfasst: 31.07.2011 17:40
von c4s
Ich zeichne nichts "selbst". Es geht mir nur darum die Farben, die PureBasic mit DrawingMode(#PB_2DDrawing_Gradient) malt, etwas zu manipulieren. Daher der CustomFilterCallback().
Re: Optimierung für Sqr(a²+b²) ?
Verfasst: 31.07.2011 17:52
von STARGÅTE
Äm, wäre da nicht CustomGradient() besser geeignet ?
Re: Optimierung für Sqr(a²+b²) ?
Verfasst: 31.07.2011 18:20
von c4s
Ich will nicht die Farben des Verlaufs an sich verändern, sondern ihn nur an bestimmten Stellen "erlauben". In meinem Beispiel soll er zur Mitte hin abnehmen. Dort verringere ich also den Alpha-Wert der SourceColor (siehe CustomFilterCallback()).
Re: Optimierung für Sqr(a²+b²) ?
Verfasst: 01.08.2011 14:38
von Helle
Keine Angst, es folgt kein ASM-Code (da ja kein Interesse)

. Ich habe trotzdem eben in der Mittagspause die 2 Zeilen PB-Code mal in 11 Zeilen ASM-Code mit Nutzung von SSE_4_1 umgesetzt und dies ist ca. 5,5-mal (!!!) schneller als der PB-Code, bei für Grafik ausreichender Genauigkeit. Also: Wie wollt ihr tolle Geschwindigkeits-Steigerungen erhalten, wenn die Möglichkeiten halbwegs aktueller Prozessoren nicht ausgenutzt werden? Ohne ASM ist dies nunmal leider (in PB) nicht möglich.
In diesem Sinne
Helle
Re: Optimierung für Sqr(a²+b²) ?
Verfasst: 01.08.2011 17:03
von c4s
@Helle
Der Vollständigkeit halber darfst du es trotzdem gerne posten.

Re: Optimierung für Sqr(a²+b²) ?
Verfasst: 01.08.2011 22:06
von Helle
So, na dann, habe nach einem Kneipenbesuch (ct-Tag, Renten-Erstzahlungstag in x(

)-Jahren) meine Abspeicherung auf dem USB-Stick folgendermaßen überarbeitet:
Code: Alles auswählen
Global PX.f
Global PY.f
Global PF.f
Global X.f = 100
Global Y.f = 75
;----------------------------
Global PX1.f
Global PY1.f
Global PF1.f
Global X1.f = 100
Global Y1.f = 75
Global Radius.f = 50 ;150
TA = ElapsedMilliseconds()
For i = 1 To 100000000
PX = X - Radius : PY = Y - Radius
PF.f = Sqr(PX * PX + PY * PY) / Radius
Next
TE = ElapsedMilliseconds() - TA
TA1 = ElapsedMilliseconds()
For i = 1 To 100000000
!MOVSS xmm2,[v_Radius]
!INSERTPS xmm2,[v_Radius],10000b
!MOVSS xmm0,[v_X1]
!INSERTPS xmm0,[v_Y1],10000b
!SUBPS xmm0,xmm2
!MOVAPS xmm1,xmm0
!DPPS xmm0,xmm1,110001b
!RSQRTSS xmm1,xmm0 ;für Grafik ausreichende Genauigkeit (Fehler kleiner 1.5*2^-12)
!MULSS xmm1,xmm2
!RCPSS xmm0,xmm1
!MOVSS [v_PF1],xmm0
Next
TE1 = ElapsedMilliseconds() - TA1
MessageRequester("Vergleich", StrF(PF) + #LFCR$ + Str(TE) + #LFCR$ + StrF(PF1) + #LFCR$ + Str(TE1))
Setzt allerdings eine Intel-CPU mit SSE_4_1 voraus; ich hoffe wirklich, das AMD endlich den Bulldozer rausbringt (auch ich warte schon 2 Jahre darauf).
Dies soll nur zeigen, was mit neuen Prozis möglich ist.
Gruß
Helle