Optimierung für Sqr(a²+b²) ?
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: Optimierung für Sqr(a²+b²) ?
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.
- alter Mann
- Beiträge: 201
- Registriert: 29.08.2008 09:13
- Wohnort: hinterm Mond
Re: Optimierung für Sqr(a²+b²) ?
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
Re: Optimierung für Sqr(a²+b²) ?
Es bringt garantiert einen Vorteil.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.
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!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

Re: Optimierung für Sqr(a²+b²) ?
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.
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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Optimierung für Sqr(a²+b²) ?
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
Re: Optimierung für Sqr(a²+b²) ?
Ä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
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: Optimierung für Sqr(a²+b²) ?
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
Re: Optimierung für Sqr(a²+b²) ?
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

In diesem Sinne
Helle
Re: Optimierung für Sqr(a²+b²) ?
@Helle
Der Vollständigkeit halber darfst du es trotzdem gerne posten.
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
Re: Optimierung für Sqr(a²+b²) ?
So, na dann, habe nach einem Kneipenbesuch (ct-Tag, Renten-Erstzahlungstag in x(
)-Jahren) meine Abspeicherung auf dem USB-Stick folgendermaßen überarbeitet:
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

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))
Dies soll nur zeigen, was mit neuen Prozis möglich ist.
Gruß
Helle