Forums Neueste Beiträge
 

Mandelbrot mit Threads: Keine CPU-Vollauslastung

04/05/2015 - 10:12 von Andreas Meile | Report spam
Hallo zusammen

Vor Kurzem ebenfalls mit der beliebten Schlangen-Programmiersprache begonnen
und als Beispiel ein kleines Mandelbrot mit GUI und Threads zusammengebaut.
Zwischenstand:

http://beilagen.dreael.ch/Python/Mandelbrot_2.py

Ist noch nicht fertig, z.B. Zoom mit der Maus ist noch nicht implementiert.
Dafür der Knopf "Berechnen" und oben eine manuelle Werteeingabe vom
Ausschnitt funktioniert bereits.

Um die Berechnung auf einem 4-Kern-Prozessor zu beschleunigen, kommen
Threads zum Zug. Grundsàtzlich funktioniert dies auch, nur seltsamerweise
bleibt die Gesamt-CPU-Auslastung gemàss "top" unter Linux (Debian Wheezy
x64; dort mit "apt-get" Python installiert) sowie Windows-Taskmanager
(Windows 7 Home Premium x64, dort aktuellste amd64-Version von Python 3
installiert) immer noch bei nur etwa 25%, lediglich eine Lastverteilung auf
alle 4 Kerne findet statt. Dies passiert selbst, wenn der gewàhlte
Ausschnitt viel schwarzer Bereich (=maximale Rechentiefe erreicht)
beinhaltet, so dass also Dinge wie bei der verwendeten Message-Queue auf
einen freien Slot warten ausgeschlossen werden können.

Zum Vergleich: Eine FreeBasic-Implementierung[1] lastet meine CPU dann
wirklich zu praktisch 100% aus, die Berechnung làuft dann auch wirklich mit
dem "Turbo-Booster" durch. :-)

Für Hinweise speziell über die Thread-Implementierung bei Python sowie
allfàlligen Verbesserungsvorschlàgen am Code selber danke ich im Voraus.

Andreas

[1] http://forum.qbasic.at/viewtopic.php?tƒ18
"127.0.0.1 was ist das? Ich kenne nur ::1!" - www.swissipv6council.ch
 

Lesen sie die antworten

#1 Diez B. Roggisch
04/05/2015 - 11:07 | Warnen spam
Hallo Andreas,


Um die Berechnung auf einem 4-Kern-Prozessor zu beschleunigen, kommen Threads zum Zug. Grundsàtzlich funktioniert dies auch, nur seltsamerweise bleibt die Gesamt-CPU-Auslastung gemàss "top" unter Linux (Debian Wheezy x64; dort mit "apt-get" Python installiert) sowie Windows-Taskmanager (Windows 7 Home Premium x64, dort aktuellste amd64-Version von Python 3 installiert) immer noch bei nur etwa 25%, lediglich eine Lastverteilung auf alle 4 Kerne findet statt. Dies passiert selbst, wenn der gewàhlte Ausschnitt viel schwarzer Bereich (=maximale Rechentiefe erreicht) beinhaltet, so dass also Dinge wie bei der verwendeten Message-Queue auf einen freien Slot warten ausgeschlossen werden können.



Python kann mit mehreren Threads nicht die CPU auslasten. Die bringen also nur etwas, wenn man IO-lastig ist bzw. irgendwelche blockierenden Calls hat, die das Programm nicht lahmlegen sollen.

Und diese Einschrànkung (das sogenannte GIL - Global Interpreter Lock) ist so fundamental relevant dafür wie Python funktioniert, dass man das nicht “mal eben” àndern kann.

Darum gibt es seit inzwischen geraumer Zeit das Modul “multiprocessing”. Das ist in vielen Fàllen (und Apfelmànnchen gehört IMHO dazu, da alle Teilaufgaben unabhaenging von den anderen berechnet werden können) fast ein drop-in-replacement fuer das threading Modul.

Allerdings nicht fuer dich, denn dein Code ist ziemlich problematisch - aufgrund der Verwendung von jeder Menge globalem Zustand. Das würde man auch mit threading so nicht machen, sondern zB Arbeitsaufgaben mittels Queue.Queue verteilen. Und so arbeitet auch multiprocessing, denn geteilten, globalen Zustand gibt es dort per definition nicht.

Eine Alternative könnte fuer dein spezielles Problem (da arithmetik-lastik) auch noch PyPy sein. Das ist eine Implementierung von Python mit einem optimierenden JIT-compiler, der teilweise an C/C++ rankommt. Die versuchen auch das GIL-Problem zu lösen, durch sogenannten transaktionales Memory. Aber das ist ziemlich experimentell, und skaliert auch nicht 1:1 mit den Kernen, sondern eher bei 16-Cores und so, weil dann der Verwaltungsaufwand relativ gesehen sinkt.

Inwieweit PyPy allerdings mit GUI kann - das weiss ich nicht.

LG Diez=

Ähnliche fragen