HPC - Raytracing

Moreno Marzolla moreno.marzolla@unibo.it

Ultimo aggiornamento: 2021-10-21

Il file omp-c-ray.c. contiene l'implementazione di un semplice programma di ray-tracing scritto da John Tsiombikas e rilasciato con licenza GPLv2+. Le istruzioni per la compilazione e l'uso sono incluse nei commenti nel codice. Vengono inoltre forniti due file di input sphfract.small.in e sphfract.big.in che descrivono un oggetto frattale come quello mostrato in Figura 1; nel primo file ci sono meno dettagli, e quindi il tempo di elaborazione è inferiore.

Figura 1: Immagine corrispondente al file sphfract.big.in
Figura 1: Immagine corrispondente al file sphfract.big.in

Per compilare:

    gcc -std=c99 -Wall -Wpedantic -fopenmp omp-c-ray.c -o omp-c-ray -lm

Per produrre l'immagine rappresentata da sphfract.small.in si usa il comando:

    ./omp-c-ray -s 800x600 < sphfract.small.in > img.ppm

Viene prodotta una immagine img.ppm con risoluzione \(800 \times 600\). Per visualizzare l'immagine su Windows è utile convertirla in formato JPEG usando il comando

    convert img.ppm img.jpeg

sul server, e poi trasferire img.jpeg sul proprio PC per la visualizzazione.

Parallelizzare la funzione render() usando le direttive OpenMP appropriate. Si tenga presente che il programma seriale è ben strutturato: in particolare, le funzioni non modificano variabili globali, quindi non ci sono dipendenze nascoste da gestire. Suggerisco di usare l'immagine sphfract.small.in per fare le prove, visto che richiede meno tempo per essere calcolata (l'altra immagine richiede circa 90 secondi usando 12 thread OpenMP).

Se avanza tempo, misurare lo speedup e la strong scaling efficienty della versione parallela del programma.

Può essere utile conoscere le basi di come funziona un ray tracer basato sulla tecnica backward ray tracing usando l'algoritmo ricorsivo di Whitted (si faccia riferimento alla Figura 2); quanto segue non è necessariamente ciò che fa questo programma, ma uno schema di massima.

Figura 2: Schema di funzionamento di un ray tracer ricorsivo
Figura 2: Schema di funzionamento di un ray tracer ricorsivo

La scena viene rappresentata da un insieme di primitive geometriche (sfere, nel nostro caso). Viene lanciato un raggio primario (V) che parte dall'osservatore verso ciascuno dei pixel che compongono lo schermo su cui verrà rappresentata l'immagine. Per ciascun raggio si determina l'insieme delle intersezioni con le figure geometriche (se ce ne sono). Si considera quindi il punto p di intersezione più vicino all'osservatore, dal quale si fanno partire uno o più raggi secondari in base al tipo di materiale dell'oggetto intersecato:

Da quanto detto sopra, si può intuire come il tempo necessario per determinare il colore di un punto p dipende (anche) da quante primitive geometriche ci sono nelle vicinanze di p, che potrebbero moltiplicare i raggi riflessi/rifratti in caso di oggetti traslucidi. A sua volta, questo suggerisce che possa esistere una grande differenza tra i tempi necessari a calcolare i colori dei pixel dell'immagine, che dipendono da quando sono "affollate" certe zone della scena.

File