Das Thread-Mysterium
Übersicht

![]() |
mpmxyzBetreff: Das Thread-Mysterium |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da ich gerne meinen Mandelbrot-Renderer eine parallele Berechnung ermöglichen möchte, habe ich mich über die Thread-Implementierung von BlitzMax informiert.
Dabei ist mir eines klar geworden: Im Threaded-Modus wird kein Referenzzählungs-GC verwendet, sondern einer, welcher auch Zyklen schafft: http://www.blitzbasic.com/Comm...opic=80344 (brachte mich auf die Annahme) Hinten ist ein Testcode, welcher einem unter anderem auch die Geschwindigkeit der Programme misst. Das Besondere: Im Threaded-Modus läuft der Code ohne Probleme. Im normalen Modus gibt es durch einen Zyklus ein dickes Speicherleck. (für einen Geschwindigkeitsvergleich ohne Speicherleck die markierte Zeile entfernen) Nun merke ich, dass ich schon ein paar mal Mist erzählt hatte, weil nirgendswo steht, dass nicht der einfache Standard-GC genutzt wird. Die Geschwindigkeitseinbußen von ca. 35% kommen wohl durch den veränderten Garbage Collector. So erscheint der Compiler/BlitzMax/brl.Threads selbst aber wieder in einem anderen Licht: Ist BlitzMax-Multithreading nicht so schlimm wie sein Ruf? Kennt ihr Probleme oder habt ihr nie welche gehabt? Bitte sagt es! mfG mpmxyz Anhang zum Testen: BlitzMax: [AUSKLAPPEN] SuperStrict |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
NoobodyBetreff: Re: Das Thread-Mysterium |
![]() Antworten mit Zitat ![]() |
---|---|---|
mpmxyz hat Folgendes geschrieben: Ist BlitzMax-Multithreading nicht so schlimm wie sein Ruf?
Weil du plötzlich entdeckt hast, dass der Threaded-GC zyklische Datenstrukturen beherrscht? Das Hauptproblem im Multithreading sind die ganzen BRL-Module, die nicht darauf ausgelegt sind. Entweder fliegt einem das Programm um die Ohren, weil zwei Threads eine Ressource verwenden, die das Modul nicht ordnungsgemäss sperrt, oder es funktioniert nicht, weil von irgendeinem Thread Events abgefangen werden, auf die der andere wartet. Grosses Problem für mich war auch der grottenlahme GC im MT-Modus (ich versuchte, meinen Fraktalraytracer auf MT umzuschrauben). Alleine schon den MT-Build zu aktivieren machte das Rendern 7 Mal langsamer - mehr, als ich je durch Multithreading hätte herausholen können. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich hab bisher zwar nicht viel, aber dennoch sehr gute Erfahrung mit MT gemacht. Ganz am Anfang war es doch sehr buggy...
Ich arbeite z.B. gerade an einer Physikengine, bei der ich die Physikberechnungen in Threads ausgelagert habe. Das tolle wie ich finde ist, dass man die komplette Logik seines Spiels auslagern kann, und dann nur noch die render-methoden im MainThread ausführen muss, beides also komplett unabhängig voneinander läuft. Und was die Koordination angeht: Es gibt doch Mutexe und Signals. Wenn BMax etwas nicht alleine schafft, kann man die entsprechenden Funktionen nicht durch Wrapper ersetzen wenn etwas mal nicht klappt? Bei meinem Rechner (Core I7 Q 720) mit 4 Kernen, bzw. 8 durch Hyperthreading, macht Multitasking eine Menge aus, wenn es auch wirklich genutzt wird. Beispiel: Anno 1403, teilt alle seine Berechnungen in extrem viele parallele Threads auf. Auch der neue Firefox hat hier zugelegt. Das nutzt dann meine CPU auch wirklich mal aus. Leider machen dass nicht alle Programme. |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Noobody
In der Dokumentation steht nur, dass es einen GC mit Referenzzählung gibt. Zusätzlich zu den Gerüchten, dass es (fatale) Fehler in den Modulen gäbe, hatte diese Information für einen großen Irrtum meinerseits geführt. Woher sollte ich wissen, dass es anders ist? Aus der Dokumentation schon einmal nicht! Da ich nun nicht mehr sicher war, was stimmt und was nicht stimmt, wollte ich mit diesem Thread für mich und für andere ein wenig Klarheit schaffen. Was sollten die brl-Module denn deiner Meinung nach machen? Sollen sie alles absichern, auch wenn das bearbeitete Objekt nur in einem Thread gebraucht wird? Ich kenne auch aus anderen Sprachen einige Modul-Äquialente, welche genau die selben Probleme haben, da sie auf den Overhead verzichten wollen. Mit der Geschwindigkeit habe ich keine Probleme. Mein Mandelbrot-Renderer hat beim Umschalten auf den Threaded-Modus etwa die gleiche Rechengeschwindigkeit, wie im "Not Threaded"-Modus. Das einzige, was störend aber "behebbar" ist, ist die Tatsache, dass man Threads schwer debuggen kann. Den zum Debuggen nötigen eigenen Code muss man aber normalerweise nur ein einziges Mal schreiben. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
mpmxyz hat Folgendes geschrieben: In der Dokumentation steht nur, dass es einen GC mit Referenzzählung gibt.
Zusätzlich zu den Gerüchten, dass es (fatale) Fehler in den Modulen gäbe, hatte diese Information für einen großen Irrtum meinerseits geführt. Woher sollte ich wissen, dass es anders ist? Macht der veränderte GC im Threaded-Modus für dich so einen grossen Unterschied? Und ja, das steht nicht in der Dokumentation. So vieles steht nicht in der Dokumentation - bei BRL hapert es da ein wenig. mpmxyz hat Folgendes geschrieben: Was sollten die brl-Module denn deiner Meinung nach machen?
Sollen sie alles absichern, auch wenn das bearbeitete Objekt nur in einem Thread gebraucht wird? Wofür gibt es denn das ?Threaded-Flag, wenn es nicht genutzt wird? Das ist doch genau für solche Dinge gedacht. mpmxyz hat Folgendes geschrieben: Mein Mandelbrot-Renderer hat beim Umschalten auf den Threaded-Modus etwa die gleiche Rechengeschwindigkeit, wie im "Not Threaded"-Modus.
Ist ja schön, dass du nur ein dutzend Objekte nutzt, aber bei mehr als tausend Stück sackt die Performance einfach furchtbar ein. Den Fraktal-Raytracer, den SPH-Simulator und den normalen Raytracer musste ich daher für Multithreading-Zwecke auf C++ portieren, da sie jeweils stark auf Quaternionen, Partikelobjekte oder Vektoren aufbauten. Eine kleine GUI-Applikation, die nebenbei noch eine Datei schreiben muss oder wie bei dir ein simpler Mandelbrot-Zeichner gehen noch ziemlich gut mit dem Threaded-GC, aber bei Projekten mit grosses Objektanzahl ist Threaded eher Last als Gewinn. Firstdeathmaker hat Folgendes geschrieben: Es gibt doch Mutexe und Signals. Wenn BMax etwas nicht alleine schafft, kann man die entsprechenden Funktionen nicht durch Wrapper ersetzen wenn etwas mal nicht klappt?
Es lässt sich eben nicht alles mit Mutexes lösen ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mit dem ersten Punkt wollte ich eigentlich nur klarmachen, dass es einige Gerüchte gibt, welche nicht wahr sind. Dazu gehörten die hier und da genannten "Speicherlecks".
"?Threaded" bzw. "?Not Threaded" helfen bei dem Problem der Optimierung leider auch nicht weiter. Die Tatsache, ob ein Objekt gesichert werden muss oder nicht, kann man damit auch nicht beantworten. Ich habe bei einem extra für diesen Thread erstellten und veröffentlichten Test "nur" Einbußen im Bereich von 35% gehabt. Etwas in der Größenordnung von 85% habe ich nicht gehabt. (ein kleines Offtopic: Das Umstellen von TComplex-Objekten auf "Hardcoding" hatte bei mir eine Geschwindigkeitssteigerung von etwa 1000% gebracht. Schon ohne Multithreading bremst die Verwendung von Objekten das Programm aus.) mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group