Übung 3 zu Verteilte und Parallele Programmierung: Parallele Zelluläre Automaten (Teil 2) (PD Stefan Bosse) [4.2024]

Übung 3: Parallele Zelluläre Automaten mt Lua

Hinweise

Unter seltenen Bedingungen (Race conditions!) kann lvm fehlerhaft arbeiten und "abstürzen" (IO Fehler) → lvm neu starten, und die Snippets im Notebook nochmals ausführen!

Lua Code Ausführen

  1. Der Programmcode kann in dem oberen Teilfenster eines Snippets verändert werden.
  2. Der Programmcode wird ausgeführt durch Drücken der Playtaste ▸ im unteren Teilfenster (Ausgabekonsole).
  3. Die Ausgabekonsole kann auf der rechten Seite gelöscht werden durch Drücken von ✗.
  4. Hin und wieder kann eine Aktualisierung des Ausgabefensters durch Drücken des Knopfes ↻ erforderlich sein.
  5. Bei parallelen Prozessen werden jeweils neue VM Instanzen in Threads gestartet. Wenn etwas schief läuft kann das Programm hängen und nicht terminieren (also der aktuelle Codeabschnitt). Der Abbruch kann versucht werden durch Drücken des Knopfes ◼.

Programmierung der lvm

 ▸ 
 ◼ 
 ✗ 
 ↻ 
 ≡ 

ZA Simulation

Wichtig: Da Shared Memory verwendet wird (intern über ein SM-Matrix Objekt) dürfen die Zustandsdatenvariablen der Zellen nur noch vom Typ number sein (Integer, Float)!

Eine Partition

Mutiple Partitionen

Unterstütze Paritionsformate

┌─────┐   ┌─────┐  ┌─────┬─────┐                           
│     │   │  1  │  │  1  │  2  │                           
│  1  │   ├─────┤  ├─────┼─────┤                           
│     │   │  2  │  │  3  │  4  │                           
└─────┘   └─────┘  └─────┴─────┘                           
                                                           
┌─────┬─────┐    ┌─────┬─────┐    ┌─────┬─────┬─────┬─────┐
│  1  │  2  │    │  1  │  2  │    │  1  │  2  │  3  │  4  │
├─────┼─────┤    ├─────┼─────┤    ├─────┼─────┼─────┼─────┤
│  3  │  4  │    │  3  │  4  │    │  5  │  6  │  7  │  8  │
├─────┼─────┤    ├─────┼─────┤    ├─────┼─────┼─────┼─────┤
│  5  │  6  │    │  5  │  6  │    │  9  │ 10  │ 11  │ 12  │
└─────┴─────┘    ├─────┼─────┤    ├─────┼─────┼─────┼─────┤
                 │  7  │  8  │    │ 13  │ 14  │ 15  │ 16  │
                 └─────┴─────┘    └─────┴─────┴─────┴─────┘

Wichtig: Die Partitionierung in x- und y-Richtung muss ganzzahlig sein, d.h. die Größe der Automatenwelt muss durch die Anzahl Spalten und Zeilen ganzzahlig teilbar sein!

Sensoren und Aktoren

if model.neighbors == 4 then
    -- Neumann
    self.neighbors = {
      left    = {-1,0},
      right   = {1,0},
      bottom  = {0,1},
      top     = {0,-1}
    }
elseif model.neighbors == 8 then
    -- Moore
    self.neighbors = {
      left        = {-1,0},
      right       = {1,0},
      bottom      = {0,1},
      top         = {0,-1},
      topleft     = {-1,-1},
      topright    = {1,-1},
      bottomleft  = {-1,1},
      bottomright = {1,1}
    }
end
┌──────────┬──────────┬──────────┬────▶ x
│          │          │          │       
│ topleft  │   top    │ topright │       
│          │          │          │       
├──────────┼──────────┼──────────┤       
│          │          │          │       
│ left     │  pixel   │ right    │       
│          │          │          │       
├──────────┼──────────┼──────────┤       
│          │          │          │       
│ bottom-  │  bottom  │ bottom-  │       
│ left     │          │ right    │       
├──────────┴──────────┴──────────┘       
│                                        
│                                        
▼  y                                     

Modell


Das Zellenmodell

 ▸ 
 ◼ 
 ✗ 
 ↻ 
 ≡ 


Das Welt- und Simulationsmodell

 ▸ 
 ◼ 
 ✗ 
 ↻ 
 ≡ 

Simulation erzuegen


Den Simulator erzeugen

 ▸ 
 ◼ 
 ✗ 
 ↻ 
 ≡ 

Simulation/Ausführung

Nachfolgendes Snippet ausführen (Play Button drücken) - es wird zunächst keine Grafik sichtbar werden!

ZA World
 ▸ 

 ✗ 


Die Simulation

 ▸ 
 ◼ 
 ✗ 
 ↻ 
 ≡ 


Simulation terminieren

 ▸ 
 ◼ 
 ✗ 
 ↻ 
 ≡ 

Test


Test (Aufgabe 5)

 ▸ 
 ◼ 
 ✗ 
 ↻ 
 ≡ 

Modelle

Verschiedene Modelle (Pseudonotation) zum Ausprobieren.

Cave

state    : {open,wasOpen}
before   : wasOpen=open
acitivty : 
  surrounding = count(neighbors,wasopen==true)
  open=(wasOpen and surrounding >= A) or surrounding >= B 
initialize : open=random()>density

Maze

state    : {alive,wasAlive,simulated}
before   : wasAlive=alive
activity : 
  surrounding = count(neighbors,wasopen==true)
  simulated < 20?
    alive = surrounding == 1 or surrounding == 2 and alive;
  simulated > 20 and surrounding == 2?
    alive = true;
  simulated = self.simulated+1
initialize : alive = random() > 0.6; simulated=0

Game Of Live

state    : {alive,wasAlive}
before   : wasAlive=alive
activity : 
  surrounding = count(neighbors, wasAlive==true)
  alive = surrounding == 3 or surrounding == 2 and alive
initialize : alive = random() > 0.5

Maßzahlen

Speed-up S:

\[ {S}{\left({N}\right)}=\frac{{T}_{{1}}}{{T}_{{N}}} \]

Skalierung

\[ \eta{\left({N}\right)}=\frac{{S}_{{N}}}{{N}} \]

Aufgaben

Aufgabe.
  1. Implementiere den Maze Algorithmus (oben) mit N=128 × 128 (120 für P=6) und teste die Berechnung für Partitionsgrößen P={1,2,4,6,8,16}. Verwende den UPRIGHT Scheduler.

  2. Wie verändert sich die Rechenzeit mit der Anzahl der Partitionen P? Erstelle einen Plot (für P={1,2,4,6,8,16}. Berechne den Speed-up aus den gemessenen Zeitwerten für einen Simulationsschritt und pro Zelle, trage die Werte in dem y-Array ein. Messe die Zeit für 20 Simulationsschritte.

Plot Speed-up


 ▸ 
 ✗ 
 ≡ 

  1. Berechne aus 2. die Skalierung
Plot Skalierung


 ▸ 
 ✗ 
 ≡ 

  1. Was passiert wenn bei P=4 die Weltgröße verändert wird mit der Rechenzeit für einen Simulationsschrit pro Zelle? Wähle N={50,80,100,150,200,300,400,500}. Keine Visualisierung (entferne simulator:draw)!
Plot Rechenzeit / Zelle


 ▸ 
 ✗ 
 ≡ 

  1. Prüfe ob der Simulator korrekt arbeitet indem das Ergebnis für P=1 mit P={2,4,6,8,16} verglichen wird. Wichtig: Alle Experimente mit dem gleichen Startwerten (data.init).



Hilfe



Einreichung (Assignment #2024-88224 )



Prüfen



Bewerten (Lehrer)




Created by the NoteBook Compiler Ver. 1.27.2 (c) Dr. Stefan Bosse (Mon Apr 22 2024 15:16:48 GMT+0200 (Central European Summer Time))