AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Mandelbrot-Menge optimieren

Ein Thema von MrMooed · begonnen am 30. Sep 2012 · letzter Beitrag vom 1. Okt 2012
Antwort Antwort
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#1

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 15:04
Eigentlich wollte ich Multithreading erst am Schluss machen, da ich sonst schlechten Code mit Hardware kompensiere

Nun gut .. ich würde es dann so machen, dass jeder Thread einen Streifen des Bildes rechnen muss. Also 'Fensterbreite / CPUKerne' dann muss ich ihm noch den ganzen Algorithmus und die Zeichenfunktion in den Thread packen oder ?
Somit muss dem Thread dann noch übergeben werden von welchem xMin - xMax er rechnen soll.
Aber auf meine Form kann der Thread nicht selber zeichnen - eine TBitMap als Rückgabe

Hatte vor langer Zeit mal einen Link zum multithreading gefunden, vllt kennt jemand etwas noch verständlicheres ?
Multithreading
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#2

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 15:11
Eigentlich wollte ich Multithreading erst am Schluss machen, da ich sonst schlechten Code mit Hardware kompensiere
Richtig so!

Vielleicht machst du es auch gleich in zwei Schritten. Erst die Threads alle Werte berechnen lassen und in einem Array zwischenspeichern. Und dann den Main-Thread alles zeichnen lassen. Letzteres lässt sich ja via Multithreading vermutlich sowieso nicht beschleunigen. Höchstens noch via OpenGL, aber das ist ... weit gegriffen.
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 15:24
Ich habe mal Mandelbrot programmiert, auch mit Multithreading. Ich habe einfach ein Bitmap genommen und dann jeden Thread jeweils die n-te, n+1-te, n+2-te usw. Scanline berechnen lassen. Also z.B. bei 4 Threads wäre der 1. Thread zuständig für die 0, 4, 8, ... Scanline, der 2. Thread für die 1, 5, 9, ..., der 3. für die 2, 6, 10, ..., und der 4. für die 3, 7, 11, ...

Das ist leicht zu implementieren und hat den Vorteil, dass die Threads alle in etwa gleich viel Arbeit verrichten müssen (wenn man das ganze Bild nur in 4 große Teile aufteilen würde, könnte es sein, dass auf 3 Teilen fast nichts zu berechnen ist und dann doch wieder nur ein Thread die ganze Arbeit macht).

Man sollte das Bild übrigens auf jeden Fall in Zeilen aufteilen, nicht in Spalten wie in #7 impliziert, da das Bild zeilenweise im Speicher liegt, d.h. man spart dadurch eine Menge TBitmap.Scanline-Aufrufe und außerdem reduziert man Cache-Misses.

Geändert von Namenloser (30. Sep 2012 um 15:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 15:35
Das Wurzelziehen mit SQRT() sollte man bei der Mandelbrotmenge unbedingt vermeiden, denn es kostet viel Zeit.
In der rekursiven Variante wird ja auf (A < 2) abgefragt.
Lässt man das Wurzelziehen weg, dann muss auch die Konstante quadriert werden (2*2=4):
Delphi-Quellcode:
if (nX*nX + nY*nY) >= 4.0 then
  exit;
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#5

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 15:48
dumme Frage, aber können die Threads gleichzeitig auf die TBitMap zeichnen ? Denn sie sollten dank ScanLine ja niemals in der selben Zeile sein

Ansonsten habe ich nachgedacht die Zeilen in Abhängigkeit von den Kernen zu erstellen, da es evtl. zu viel Aufwand ist X-kleine Threads zu erstellen als z.B. 8 die etwas mehr zu rechnen haben. Diese 8 Streifen könnten jeweils eine eigene BitMap haben, die dann im MainThread zusammengeklebt werden

Das Wurzelziehen mit SQRT() sollte man bei der Mandelbrotmenge unbedingt vermeiden, denn es kostet viel Zeit.
In der rekursiven Variante wird ja auf (A < 2) abgefragt.
Lässt man das Wurzelziehen weg, dann muss auch die Konstante quadriert werden (2*2=4):
Also ich habe gerade mal die Abbruchbedingung durch 4 ersetzt und die Wurzel entfernt - nun habe ich hübsche bunte Balken aber kein Apfelmänchen
Delphi-Quellcode:
  if (i < 100) and (A < 4)
    then begin
           nX := (X*X) - (Y*Y) + X_Ko;
           nY := 2*X*Y + Y_Ko;
           nA := nX*nX + nY*nY;
           result := rechne(X_Ko, Y_Ko, nX, nY, nA, i+1);
         end;

//Edit:
Kann die .Execute nicht auf andere Methoden zugreifen ? Schutzklassen sollten da ja keine Probleme bereiten .. aber wenn ich meine 'rechne' function in der .Execute aufrufe passiert nichts - kopiere ich die function hinein läuft es ?!

Geändert von MrMooed (30. Sep 2012 um 16:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 16:12
Also ich habe gerade mal die Abbruchbedingung durch 4 ersetzt und die Wurzel entfernt - nun habe ich hübsche bunte Balken aber kein Apfelmänchen
Dann hast du irgendwo noch einen anderen Fehler.
Was ich über das Wurzelziehen und dessen Vermeidung geschrieben habe ist richtig und ist eigentlich in jedem Code so umgesetzt.
Z.B. auf Wikipedia http://de.wikipedia.org/wiki/Mandelb...es_Bildpunktes
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Mandelbrot-Menge optimieren

  Alt 30. Sep 2012, 16:33
komischer weise tritt dieses Fehlverhalten nur bei der Rekursiven Variante auf
Das finde ich dann doch sehr seltsam .. kann mich da jemand aufklären was mein Denkfehler bei der Rekursion ist ?
Strange..
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz