Homework 5 - Ray Tracing with POSIX Threads

Computer Architecture I ShanghaiTech University
HW4 HW5 HW6

Introduction

Ray tracing is an algorithm to generate photorealistic images or animations. In recent years, ray tracing is becoming more and more widely used. You may imagine that it is difficult to implement such an amazing algorithm, but actually, even a simple physically based rendering (PBR) tracer can be compacted to 300 lines of C code.

This homework is designed for you to enjoy the power of computer graphics while accelerating ray tracing with pthread. Don't be afraid, you don't have to understand the algorithm. Here is the template.

cornell box

Your Mission

You only need to focus on main() in main.c. There are 5 nested loops here. You only need to make at least one of them parallel with pthread. Pay attention, some of the loops are designed as traps and will not gain much speedup if you try to parallel them. Try to figure out the traps.

Compile and Run the Template

make
time ./hw5 24
Run the above instructions in your terminal, and you will find an image called image.ppm appears. Double click, and you will see a noisy image. It is noisy because the quality of ray tracing depends on samples per pixel (SPP). In the above example, SPP is set to 24 in time ./hw5 24. You can try to set SPP to a larger number, such as 100, 200, 1000, ...

Rules

  1. You must make sure that the output image looks similar enough (do not need to be exactly the same) compared with the one generated by the template code when SPP is large.
  2. You must use pthread, and OpenMP is not allowed for this homework.
  3. You must make your code compilable with -Wpedantic -Wall -Wextra -Werror -std=c89.
  4. You must avoid any memory leaks.
  5. You must not output the image with hard code.
  6. You must not use any third-party libraries.
  7. You must not use any denosing techniques.
  8. You must not use self-defined scene settings instead of using the settings defined in scene.h, or use self-defined image writing functions instead of using the one given in image.h, because we may modify them.

Hints

  1. You do not need to optimize the random number generator.
  2. You do not need to worry about the load balancing of threads.

Submission and Grading

You only need to submit main.c to Autolab. However, it is difficult to check whether your output is OK enough on Autolab since it is an image, so the grading part is split into two stages. Autolab is used to test your speed, and later we will manually check the output image.

Case 1: If your output image is not similar enough to the one generated by the template code, you will definitely get 0.

Case 2: If your output image is similar enough to the one generated by the template code, you will be graded based on Autolab test cases as usual. There are 4 test cases and each of them is worth 10, 20, 30, 40 respectively. Thus the total score is 100.

You do not need to worry any about the similarity test if you just make it parallel with pthread.

Autolab Server Configurations

Have Fun

You can edit the scene by inserting or deleting spheres in scene.h. The variable camera_offset sometimes should be properly set to avoid the camera being blocked by big spheres.

Related Materials

  1. Ray Tracing in One Weekend
  2. Global Illumination in 99 lines
  3. Physically Based Rendering Tracer