Optimierung für Sqr(a²+b²) ?

Anfängerfragen zum Programmieren mit PureBasic.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Optimierung für Sqr(a²+b²) ?

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
alter Mann
Beiträge: 201
Registriert: 29.08.2008 09:13
Wohnort: hinterm Mond

Re: Optimierung für Sqr(a²+b²) ?

Beitrag 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
Win11 64Bit / PB 6.0
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: Optimierung für Sqr(a²+b²) ?

Beitrag 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.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Optimierung für Sqr(a²+b²) ?

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Optimierung für Sqr(a²+b²) ?

Beitrag 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().
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Optimierung für Sqr(a²+b²) ?

Beitrag von STARGÅTE »

Äm, wäre da nicht CustomGradient() besser geeignet ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Optimierung für Sqr(a²+b²) ?

Beitrag 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()).
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Optimierung für Sqr(a²+b²) ?

Beitrag von Helle »

Keine Angst, es folgt kein ASM-Code (da ja kein Interesse) :mrgreen:. 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
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Optimierung für Sqr(a²+b²) ?

Beitrag von c4s »

@Helle
Der Vollständigkeit halber darfst du es trotzdem gerne posten. ;-)
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Optimierung für Sqr(a²+b²) ?

Beitrag von Helle »

So, na dann, habe nach einem Kneipenbesuch (ct-Tag, Renten-Erstzahlungstag in x( :D )-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
Antworten