Mandelbrot

Fragen zu Programmiersprachen und Software für den Hive und die Propellerchips
Antworten
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

Mandelbrot

Beitrag von U-Held »

Hallo Chefprogrammierer,

ich versuche, das Apfelmännchen von yeti und drohne235 (siehe https://hive-project.de/board/viewtopic.php?f=10&t=1072) zu parallelisieren. Das Programm liegt im Anhang, bitte mal ausprobieren.

Ich scheitere an der Stelle, wo die Cogs abwechselnd auf den Bus zugreifen sollen. Entweder klappt der Sperrmechanismus mit lkBus nicht oder die Cogs hinterlassen doch noch irgendwelche Pegel auf dem Bus. Das "dira := 0" in drawPixel sollte eigentlich den Cog vom Bus nehmen. Man kann das Elend sehen, wenn man die Zeile "ifnot is_slave" in drawPixel auskommentiert.

Mit der Konstante MAX_PARALLEL steuert man die Anzahl gestarteter Cogs. Bei 1 oder 0 wird kein "Slave-"Cog gestartet, und das Programm läuft fehlerfrei durch.

Notfalls könnte ich den Haupt-Cog zum Busmaster erklären. Alle Worker würden dann ihre drawPixel-Anforderungen über Shared Memory übergeben, und nur der Busmaster benutzt die ios.g0*-Funktionen. Aber dann käme ich nur auf eine Parallelität von 7 und wüsste immer noch nicht, wie sich mehrere Cogs den Bus teilen.

Irgendwelche konstruktiven Vorschläge?

Grüße
Dateianhänge
mandelbrot_hive_gr_p.spin
(9.46 KiB) 752-mal heruntergeladen
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Mandelbrot

Beitrag von drohne235 »

Interessantes Thema. :twisted:

Bisher haben wir meist nur neben dem Loader eine Cog in unseren Anwendungen laufen, welche auf den Bus zugreift. Hier mal ein einfaches Beispiel, in welchem sieben Cogs Text koordiniert direkt selbst über den Bus ausgeben. Dabei gibt es diverse Fallstricke:

- die aufrufende Main-Cog muss ebenfalls den Bus freigeben, welcher per ios.start initialisiert und belegt wird
- auch die Bildschirmroutinen in Bellatrix sind nicht multicogfähig: setzt eine Cog zum Beispiel die Farbe oder die Cursorposition, ist dieser veränderte Kontext auch für die anderen Cogs gültig
- umgehen könnte man dies teilweise, indem die Cogs getrennte Fenster, oder vollständig indem man die getrennten Screens (nur 3 möglich) verwenden

usw.

Ich konnte in dem Mandelbrotprog jetzt nicht den konkreten Fehler gefunden, vermute aber, dass der Bus der MainCog nicht freigegeben wird. Da das ständige aktivieren und deaktivieren vom Bus inklusive Semaphorenhandling auch Zeit kostet, ist es vielleicht wirklich einfacher, die Busarbeit der MainCog zu überlassen und nur die Ergebnisse einzusammeln.
Dateianhänge
bustest-1.spin
(8.54 KiB) 736-mal heruntergeladen
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
Benutzeravatar
PIC18F2550
Beiträge: 2831
Registriert: Fr 30. Sep 2011, 13:08

Re: Mandelbrot

Beitrag von PIC18F2550 »

drohne235 hat geschrieben: ... ist es vielleicht wirklich einfacher, die Busarbeit der MainCog zu überlassen und nur die Ergebnisse einzusammeln.
Zustimmung sonst wird die Verwaltung zu groß.
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

Re: Mandelbrot

Beitrag von U-Held »

Zwischenzeitlich habe ich meinen Fehler selbst gefunden: Der Start-COG musste noch den Bus freigeben. Ich war schon am Verzweifeln und hatte eine Variante mit 7 Workern und 1 Busmaster geschrieben. Na, was solls, ich kann ja mal beide Versionen gegeneinander antreten lassen.

Jetzt schreibe ich eine einfache Diagramm-Anzeige, um Messergebnisse grafisch darzustellen. Das Auge sieht nun mal an einer Linie eher, wo der Knick ist, als an einer Zahlenkolonne. Dann kann ich auch verschiedene Ideen ausprobieren und schauen, ob irgendwann die Hauptschleife in Bella zum Flaschenhals wird. ;-)

PASM kommt später.

Grüße
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

Re: Mandelbrot

Beitrag von U-Held »

Während yeti fleißig Mandelbrötchen bäckt, suche ich nach dem Knick in einer Linie. Und tatsächlich: Ich habe etwas gefunden. Um standesgemäß zu suchen, ist ein Linienanzeigeprogramm für den Hive entstanden (diagram). Das kann nur so viel, wie ich im Moment brauche: eine CSV-Datei lesen, in der max. 32 Linien mit jeweils genau 8 Punkten drin stehen. Alle Linien haben einen gemeinsamen Definitionsbereich, der von 1-8 geht (Auf der x-Achse wird der Bereich von 0-8 angezeigt.). Die Binaries, der Quelltext und eine kurze Bedienungsanleitung für diagram liegen im Anhang.

In diagram kann man Linien mit 2 y-Achsen anzeigen. Das ermöglicht, Linien mit weit auseinanderliegenden Wertebereichen so zu skalieren, dass man sie optisch vergleichen kann. Ich benutze den Tile-Treiber des G0-Modus. Da muss sich das diagram auf 4 Farben beschränken. Um dann noch zu erkennen, welche Beschriftung zu welcher Linie gehört, blinken die Linien und Beschriftungen, wenn man mit TAB von einer zur anderen wechselt. Eines ist mir dabei nicht gelungen: die Tastatur-Modifier abzufragen. Weder Shift noch Ctrl bekomme ich zu Gesicht. Vielleicht findet jemand anderes den Fehler. Man kann also nicht mit Shift+TAB rückwärts durch die Linien gehen.

Und nun zur eigentlichen Untersuchung: Wie zu erwarten verhalten sich Darstellungszeit und Anzahl eingesetzter Cogs nicht umgekehrt proportional zueinander. Und wie zu erwarten bremst die Art und Weise, wie man ein Pixel anzeigen lässt, die Darstellungsgeschwindigkeit. Ich hätte aber nicht gedacht, dass das schon ab dem 4. Cog und dann noch so stark wirkt. Im Bild unten ist der Knick in der weiß markierten ("blinkenden") Linie zu sehen. Das ist die Effizienz-Linie, die zeigt, wie viele Pixel pro Cog und Zeiteinheit angezeigt werden. Daneben gibt es die Gesamtzeit t für die Darstellung, die Wartezyklen im Mandelbrot-Programm (also in Regnatix) auf den Bus und die Leerlaufzyklen in der Hauptschleife von Bellatrix.

Für die Zeitmessung wurden Administra und reg-ios erweitert. Bisher ist es nicht möglich, einen konsistenten Zeitstempel von der RTC abzufragen, obwohl die das anbietet. Und auch das Subtrahieren von 2 Zeitstempeln ist aktuell recht umständlich. Die Erweiterungbasiert auf date_time_ts.spin (adm-dttme.spin). Vielleicht kann die Erweiterung ins Trios übernommen werden.

Das Messprogramm macht den Fehler, die csv-Datei im Root-Verzeichnis der SD-Karte anzulegen. Warum das passiert, weiß ich noch nicht.

Die nächsten Versuche müssen in 2 Richtungen gehen: Umsetzung der Mandelbrot-Berechnung in Assembler (das ist offensichtlich) und Einbau einer speziellen Pixel-Funktion in Bellatrix. Es soll nur noch die Anfangskoordinate übergeben werden und dann die Farben für die nächsten 4, 16, 64 oder 256 Pixel in aufsteigender x-Richtung. Mal sehen, ob das was bringt. Möglicherweise verliere ich schon eher die Lust am Experiment.

Grüße
Dateianhänge
20180227_mandelb_src.zip
(77.35 KiB) 693-mal heruntergeladen
20180227_mandelb_bin.zip
(25.48 KiB) 699-mal heruntergeladen
Linienauswahl
Linienauswahl
Diagram mit dem Ergebnis von mess1.bin
Diagram mit dem Ergebnis von mess1.bin
Benutzeravatar
yeti
Beiträge: 2300
Registriert: Fr 27. Aug 2010, 14:48
Wohnort: Wrong Planet
Kontaktdaten:

Re: Mandelbrot

Beitrag von yeti »

Spannend!
U-Held hat geschrieben:Mal sehen, ob das was bringt. Möglicherweise verliere ich schon eher die Lust am Experiment.
Manchmal braucht man nur 'ne Pause...
𝖂𝖎𝖗 𝖐𝖔̈𝖓𝖓𝖊𝖓 𝖆𝖑𝖑𝖊𝖘 𝖆𝖚𝖘𝖘𝖊𝖗 𝖎𝖓 𝕱𝖗𝖚̈𝖍𝖑𝖎𝖓𝖌, 𝕾𝖔𝖒𝖒𝖊𝖗, 𝕳𝖊𝖗𝖇𝖘𝖙 𝖚𝖓𝖉 𝖂𝖎𝖓𝖙𝖊𝖗! – 𝕯𝖊𝖚𝖙𝖘𝖈𝖍𝖑𝖆𝖓𝖉.
"Du willst hier nicht klicken. Dies interessiert Dich nicht." — Yeti.
"DNA is a four letter word!" — Yeti.
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Mandelbrot

Beitrag von drohne235 »

Ich bin zwar mehr der Typ Conway/Zellulare System, aber so Sachen rund um Fraktale sind immer eine schöne Denksportaufgabe! ;)


Zeiterfassung:

Wo finde ich adm-dttme.spin?

Pixelcache:

Wenn die Darstellung die Berechnung ausbremst, könnte man vielleicht einen Puffer als Cache in Regnatix verwenden: sieben Cogs keilen den Cache in voller Geschwindigkeit mit den Apfelmänchendaten voll, eine Cog kümmert sich um Übertragung zu Bellatrix.

Keyboardabfrage/Zusatztasten:

Habe den Fehler gefunden. Die Funktionsnummer für spec in g0key stimmt nicht mit der Nummer im IOS überein. Kommt davon, wenn man die Nummer (in g0key) fest verdrahtet, und nicht die globale Definitionsdatei (glob-con.spin) verwendet... ;)Ändere ich für die nexte TriOS-Version.

Verzeichnisse/Dateien:

Nutze doch sddmact(ios#DM_USER), der Usermarker zeigt doch immer auf das aktuelle Verzeichnis.

Warum ios#DM_C nicht funktioniert, kann ich gerade nicht erkennen. Ich habe versucht, die Funktion in Regime nachzuvollziehen mit dmlist/dmset/dm und da funktioniert der C-Marker. Seltsame Sache das...

--- {guru meditation} ---

So, habe die Ursache gefunden. Korrigierter Code (in mess2 schauen) ist anhänglich. Die Ursache ist folgende:

1. Problem: ios.start muss ausgeführt werden, da dort nach dem Start wieder über DM_USER in das aktuelle Userverzeichnis gewechselt wird. Ohne ios.start steht der DM auf Root und es wird im folgende ios.admLoad die Datei nicht im Userverzeichnis gesucht, sondern im Stammverzeichnis.

2. Problem: Durch das Laden eines Administra-Chipcodes geht der DM_USER verloren. Ist ja für Administra quasi wie eine Gehirnwäsche, also woher soll Admin wissen, in welchem Verzeichnis wir uns aktuell befinden? Aber Gehirnwäsche ist eine coole Sache, und ich habe das ja schon an einigen Stellen genutzt - siehe Boing-Demo, welches ebenfalls einen eigenen Administracode startet. Die Lösung: Den aktuellen DM_USER kann man vor der Gehirnwäsche auslesen und nach dem Laden des Chipcodes wieder setzen. (Noch kniffliger ist das bei mental: Hier wechsle ich nicht nur den Chipcode, sondern auch noch von Dirmarkern im alten Code zu echten Pfaden und Verzeichnissen im neuen Code. Da hilft dann auch kein gesicherter Dirmarkerwert mehr, sowas kennt der Administracode von mental nicht mehr...)

Habe den Code angepasst, jetzt startet mess2 auch aus dem Unterverzeichnis und die CVS-Datei wird ebenfalls dort abgelegt.

:)

ios.sdseek(0) ist nicht nötig nach einem open.

Ich muss echt mal eine neue TriOS-Version ausrollen: Habe bemerkt, dass ich schon so einige Sachen aus g0tools ins ios (Farben und screen setzen usw.) eigebaut habe... ;)
Dateianhänge
apfel.zip
(101.51 KiB) 701-mal heruntergeladen
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
U-Held
Beiträge: 69
Registriert: Mi 14. Dez 2011, 22:05

Re: Mandelbrot

Beitrag von U-Held »

drohne235 hat geschrieben:Wo finde ich adm-dttme.spin?
Mist, habe ich beim Rückbau meiner wilden Trios-Änderungen vergessen. Ist wirklich nur aus dem OBEX gezogen, _epoc auf 1.1.2000 (=_eprop) gesetzt und Datei umbenannt. Siehe Anhang.

Danke für die Korrekturen und Hinweise. Die schaue ich mir in den nächsten Tagen in Ruhe an (soweit das im ÖPNV geht) und werde sie einarbeiten.

Grüße
Dateianhänge
adm-dttme.zip
date_time_ts.spin von Bob Belleville
(2.65 KiB) 669-mal heruntergeladen
Antworten