Seite 1 von 1

Praktikum 4: Aufgabenstellung (Supersampling/AOS)

Verfasst: 18. Dez 2011 18:45
von simon.r
Hallo, ich habe aktuell ein paar Fragen zur Aufgabenstellung:
1) In der Mitteilung, es gebe eine neue Version der Aufgabenstellung, steht, dass man beim Ambient Occlusion Shading die Wahl zwischen uniformer und zufälliger Variante habe. Hier scheint aber eher die Wahl bezüglich des Supersamplings gemeint zu sein, da nur der 7. Absatz von 3.1 geändert wurde?
2) Sowohl CCamera.createRayForPixel als auch AOSampler.sample benutzen intern rand() zur Erzeugung von Zufallszahlen - rand() ist allerdings thread-unsafe (siehe ua. [BO10]). Sollen wir das eiskalt ignorieren oder aber durch einen Mutex alle Aufrufe schützen? Inwiefern ist es dann überhaupt sinnvoll die zufällige Implementierung zu nehmen?
3) Darf man für CCamera.createRayForPixel einen Overload erstellen, der x- und y-Koordinate als floats entgegennimmt (Stichwort uniformes Supersampling)?

Re: Praktikum 4: Aufgabenstellung (Supersampling/AOS)

Verfasst: 19. Dez 2011 00:11
von mw1039
simon.r hat geschrieben:1) In der Mitteilung, es gebe eine neue Version der Aufgabenstellung, steht, dass man beim Ambient Occlusion Shading die Wahl zwischen uniformer und zufälliger Variante habe. Hier scheint aber eher die Wahl bezüglich des Supersamplings gemeint zu sein, da nur der 7. Absatz von 3.1 geändert wurde?
Oh, ja, genau. Das war ein Fehler von mir. Danke fuer den Hinweis. Habs im Titel der Aufgabenstellungs-pdf im Moodle korrigiert.
simon.r hat geschrieben:2) Sowohl CCamera.createRayForPixel als auch AOSampler.sample benutzen intern rand() zur Erzeugung von Zufallszahlen - rand() ist allerdings thread-unsafe (siehe ua. [BO10]). Sollen wir das eiskalt ignorieren oder aber durch einen Mutex alle Aufrufe schützen?
Alles was in einer parallelen Variante Probleme bereiten kann, muss gesichert werden.
simon.r hat geschrieben:Inwiefern ist es dann überhaupt sinnvoll die zufällige Implementierung zu nehmen?
Das koennt ihr frei entscheiden. Den Code fuer die zufaellige Variante koennt ihr (an eure Beduerfnisse angepasst) uebernehmen, die uniforme muesst ihr meines Wissens nach erst programmieren.
Ich glaube nur eine einzige Instanz eines Zufallsgenerators zu benutzen und diese threadsafe zu machen, ist eher uneffizient. Man koennte z.B. auch einen Zufallsgenerator nachimplementieren und jedem Thread seine eigene Instanz des Generators geben.
Z.B. rand48:
http://www.boost.org/doc/libs/1_48_0/do ... and48.html
http://linux.about.com/library/cmd/blcmdl3_lrand48.htm
Rand48 ist nicht so schwierig nachzuimplementieren. Das sind glaube ich vier oder fuenf Zeilen.
simon.r hat geschrieben:3) Darf man für CCamera.createRayForPixel einen Overload erstellen, der x- und y-Koordinate als floats entgegennimmt (Stichwort uniformes Supersampling)?
Prinzipiell duerft ihr bei diesem Praktikum mit dem vorgegebenen Coderahmen alles machen was ihr wollt, solange es zielfuehrend ist.

Re: Praktikum 4: Aufgabenstellung (Supersampling/AOS)

Verfasst: 10. Jan 2012 12:58
von jojo1704
Wir wollen eine eigen Implementierung für Zufallszahlen verwenden und haben dazu 2 Fragen:

1. Ist es egal, ob jeder Thread die selben Startkombinationen für die Berechnung der Zufallszahlen verwendet? Wir wollen eine Implmentierung des LCG Algorithmus benutzen und verschiedene Startkombinatonen zu berechnen kann dort sehr aufwändig werden.

2. Können wir die Interfaces der vorgegebnen Funktionen createRayForPixel und sample abändern, damit wir die in den Threads erstellten Zufallszahlen an die Funktion mit übergeben können und dort statt rand() verwenden können?

Re: Praktikum 4: Aufgabenstellung (Supersampling/AOS)

Verfasst: 10. Jan 2012 17:32
von mw1039
jojo1704 hat geschrieben:1. Ist es egal, ob jeder Thread die selben Startkombinationen für die Berechnung der Zufallszahlen verwendet? Wir wollen eine Implmentierung des LCG Algorithmus benutzen und verschiedene Startkombinatonen zu berechnen kann dort sehr aufwändig werden.
Jeder Thread muss definitiv mit einem anderen Seed initialisiert werden. Sonst kann es bei unguenstigen Implementierungen passieren, dass alle Threads das gleiche tun und alles so aussieht, als ob man garkein Supersampling machen wuerde. Man kann das sicher irgendwie umgehen, aber das Standardvorgehen ist jedem Thread einen anderen Seed zu geben. Das einfachste waere jedem Thread seine Threadnummer als Seed zu geben und dann erstmal den RNG mehrere Zehntausend Iterationen zum "Aufwaermen" machen zu lassen.
jojo1704 hat geschrieben:2. Können wir die Interfaces der vorgegebnen Funktionen createRayForPixel und sample abändern, damit wir die in den Threads erstellten Zufallszahlen an die Funktion mit übergeben können und dort statt rand() verwenden können?
Geht es hier um das Praktikum oder den Wettbewerb? Im Wettbewerb ist es auf jeden Fall ok (solange ihr garantiert, dass der RNG unbiased arbeitet und nicht die Ergebnisse verzerrt. am besten einen etablierten LCG wie rand48 benutzen), im Praktikum ist es meinetwegen auch ok (solange ihr den sequentiellen Code als Vergleichsmoeglichkeit dann auch so modifiziert, dass er weiterhin laeuft). Unabhaengig davon ist der RNG aber hoechstwahrscheinlich nicht das performance bottleneck. Investiert also nicht zuviel Zeit darein.