Übungsblatt 7

Ausgabe: 10.06.2008
Abgabe: 25.06.2008, 16:00 Uhr

Aufgabe 1 (8 P)

Problemlösungen im Stil des Teile-und-Herrsche (divide-and-conquer) sind wegen ihrer regulären Struktur beliebt. Teile-und-Herrsche kann problemunabhängig wie folgt präzisiert werden:
	class Problem {
	.....
		Solution dc() {
			if(small()) return solve();
			Pair pp = divide();
			Solution s = pp.fst.dc();
			s.combine(pp.snd.dc());
			return s;
		}
	}
Solche Problemlösungen lassen sich häufig sehr gut parallelisieren; auf einem Parallelrechner wird dann entsprechend weniger Zeit benötigt. Beliebt ist eine als Master/Worker bekannte Strukturierung: eine feste Anzahl von Workers (Prozesse oder Threads) ist für die Lösung von Teilproblemen zuständig (wobei typischerweise neue Teilprobleme generiert werden - siehe oben); ein Master sorgt für die Initialisierung, sammelt die Teilergebnisse ein und stellt sie zum Gesamtergebnis zusammen.

Es gibt einen Auftragspool, in dem sich unerledigte Aufträge (= Beschreibungen von Teilproblemen) befinden, und einen Ergebnispool, in dem sich Teillösungen befinden. Jeder Worker-Prozess entnimmt wiederholt einen Auftrag aus dem Auftragspool. Der Auftrag kann dann entweder direkt erledigt werden, so dass die entsprechende Lösung im Ergebnispool abgelegt werden kann; alternativ kann es erforderlich sein, den Auftrag in kleinere Teilaufträge zu zerlegen und diese wieder im Auftragspool zu deponieren. Zu Beginn deponiert der Master die Beschreibung des Gesamtproblems im Auftragspool. Anschließend übernimmt er die Teillösungen aus dem Ergebnispool und fügt sie zu einer Gesamtlösung zusammen:

	Master: lege Problem in Auftragspool;
		wiederhole: entnimm nächste Teillösung aus Ergebnispool und kombiniere sie 
			    mit bereits entnommenen Teillösungen,bis Gesamtlösung komplett(combine).
	Worker: wiederhole: entnimm nächstes Problem aus Auftragspool;
			    falls einfaches Problem(simple), löse es (solve) und deponiere Lösung im Ergebnispool;
			    andernfalls zerlege es in Teilprobleme(divide) und deponiere diese im Auftragspool.
Formulieren Sie das Master- bzw. Worker-Verhalten in Java, wobei geeignete Objekte (raytracing.jar -> ThreadBag.java) für die Pools zum Einsatz kommen sollen!

Aufgabe 2 (8 P)

Mit dem Ansatz aus Aufgabe 1 soll ein konkretes Problem gelöst werden: Rendering eines Bildes mittels Raytracing. Ein fertiges Raytracing-Programm finden Sie unter raytracing.jar. Sie können das Programm mit dem ant-Werkzeug ausprobieren. (Es dauert etwas, bis das Bild erscheint.) Dieses Programm ist aber zu simpel gestrickt: es arbeitet nur mit zwei Fäden und ist kein Master/Worker-Programm. Übernehmen Sie die problemtypischen Teile dieses Programms in Ihre Master/ Worker-Lösung! Richten Sie eine feste Anzahl von Worker-Fäden ein, die der Anzahl der verfügbaren Prozessoren entspricht; diese Zahl erfahren Sie mit:
Runtime.getRuntime().availableProcessors()
Erläutern Sie die Arbeitsweise Ihres Programms unter Bezugnahme auf die jeweiligen Programmteile!

Aufgabe 3 (4 P)

Der Rechner human (alternativ: vader oder paste (nur 2 Prozessoren) [Achtung! Java 1.5 in /local/java1.5/bin/java]) hat vier Prozessoren. Testen Sie ihr Programm auf human unter Verwendung von 1, 2, 3 bzw. 4 Prozessoren (Parameter von main) und messen Sie die Zeiten! [Hinweis: Ein Aufsplitten des Problems in mehr als 4 Teilprobleme macht offenbar keinen Sinn.]

Durch Einsatz mehrerer Prozessoren erzielt man eine gewisse Beschleunigung (speedup), d.i. das Verhältnis der Rechenzeit auf einem Prozessor zur Rechenzeit auf n Prozessoren. Beim Einsatz von zwei Prozessoren würde man etwa eine Beschleunigung von nahezu 2 erwarten. Das Verhältnis von Beschleunigung zu n bezeichnet man als Effizienz, und man hofft, dass die Effizienz nahe bei 1 liegt.

Stellen Sie die erzielten Beschleunigungen und Effizienzen graphisch dar und diskutieren Sie die Ergebnisse!

Hinweise zur Abgabe:

Die Abgabe der Lösungen erfolgt auf zwei Wegen:

Bitte schreiben Sie zur jeder Aufgabe eine Dokumentation, in der Sie anhand von *relevanten* Codefragmenten Ihre Implementierung erläutern. Die Codefragmente sollten möglichst kurz gehalten werden und nur der Orientierung für den Leser dienen; entscheidend sind Ihre Erläuterungen, was diese Fragmente machen und wieso Sie sich für diese Art der Implementierung entschieden haben. Die Dokumentation ist bis Mittwoch 16:00 Uhr in den Tutorenfächern abzugeben .

Schicken Sie ein ZIP-Archiv an Ihren Tutor, welches den vollständigen Quellcode sowie ausführbare JAR-Dateien für die jeweiligen Aufgabenteile enthält. Der Betreff der E-Mail sollte wie folgt aussehen: "[ALP4] Blatt X - Namen Y".


Zum Bestehen des Übungsblattes müssen 50% der Punkte erreicht werden.