/* Testprogramm: Butterfly-Barriere mit in Parameter: Zahl der Prozesse, Zahl der Iterationen Autor: Jost Berthold, FB 12 Philipps-Universität Marburg *****************************************/ resource main() int i # zaehler # Zahl der Worker int n = 16 # Zahl der Iterationen int iterations = 5 getarg(1,n) getarg(2,iterations) procedure ldTrunc(int n) returns int ld { ld = 0; while (n > 1) {ld++; n = n >> 1; } } int steps = ldTrunc(n) - 1 n = 2**(steps+1) writes("Barriere mit ",n," Prozessen, ") writes(steps+1," Schritte, ") write(iterations," Wiederholungen.") op term[0:n-1]() # Nachrichten zum Stoppen des Programms op barrier[0:n]() # von main an worker (initiiert Barriere) # von Prozess 0 an main: Barriere beendet op go[0:n-1](int step) # Barrierennachrichten (Semaphorenfeld und Schritt) # worker: schreiben Punkte, bis term-Signal kommt, unterbrochen von Barrieren process worker[i = 0 to (n-1)] { bool stopped = false bool inBarrier = false int step = 0 while (not stopped) { in # Prozess beenden (ohne Bedingungen) term[i]() -> stopped = true write("Prozess ",i," beendet Arbeit") # Barriere beginnen (falls nicht schon begonnen) [] barrier[i]() st (not inBarrier) -> write("Prozess ",i," betritt Barriere") inBarrier = true step = 0 send go[i xor (2**step)](step) # Schritt "step" in der Barriere [] go[i](s) st (inBarrier and step < steps and s == step) -> ++step send go[i xor (2**step)](step) # letzter Schritt in der Barriere [] go[i](s) st (inBarrier and step == steps and s == step) -> write("Prozess ",i," verlaesst Barriere") inBarrier = false step = 0 if (i == 0) { send barrier[n]() } # keine Nachricht vorhanden: schreiben, falls nicht in Barriere [] else -> if (not inBarrier) { writes(".") nap(10) } ni } } # main while (iterations-- > 0) { nap(300) write("main: Barriere ausloesen") co[i = 0 to n-1] send barrier[i]() oc # blockiert, bis Barriere beendet receive barrier[n]() } nap(50) co[i = 0 to n-1] send term[i]() oc final { write("Programm beendet") } end