Get cmake looking for openmp & simple parallelization of render loop

This commit is contained in:
Zachary D. Rowitsch
2020-10-02 00:06:27 -04:00
parent bc478d660a
commit 34ca0eb36e
2 changed files with 16 additions and 4 deletions
CMakeLists.txt
module_raytracer

@ -1,5 +1,5 @@
project("Simple Raytracer" C) project("Simple Raytracer" C)
cmake_minimum_required(VERSION 3.3) cmake_minimum_required(VERSION 3.9)
if(NOT CMAKE_BUILD_TYPE) if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE "Debug") set(CMAKE_BUILD_TYPE "Debug")
@ -13,6 +13,14 @@ if (CMAKE_BUILD_TYPE MATCHES Debug)
add_link_options(--coverage) add_link_options(--coverage)
endif() endif()
OPTION (USE_OpenMP "Use OpenMP" ON)
IF(USE_OpenMP)
FIND_PACKAGE(OpenMP)
IF(OPENMP_C_FOUND)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
ENDIF()
ENDIF()
find_package( Doxygen ) find_package( Doxygen )
if ( DOXYGEN_FOUND ) if ( DOXYGEN_FOUND )
set( DOXYGEN_EXCLUDE_PATTERNS set( DOXYGEN_EXCLUDE_PATTERNS

@ -113,11 +113,15 @@ CANVAS_Canvas* CAMERA_render(const CAMERA_Camera* camera, const WORLD_World* wor
CANVAS_Canvas* canvas = CANVAS_new(camera->hsize, camera->vsize); CANVAS_Canvas* canvas = CANVAS_new(camera->hsize, camera->vsize);
const uint total_pixels = camera->vsize * camera->hsize; const uint total_pixels = camera->vsize * camera->hsize;
const uint one_percent_pixels = total_pixels / 100; const uint one_percent_pixels = total_pixels / 100;
uint pixel_count = 0;
#pragma omp parallel for collapse(2) schedule(dynamic)
for (uint y = 0; y < camera->vsize - 1; y++) { for (uint y = 0; y < camera->vsize - 1; y++) {
for (uint x = 0; x < camera->hsize - 1; x++) { for (uint x = 0; x < camera->hsize - 1; x++) {
const uint pixel_num = (y * camera->hsize) + x; uint this_pixel_count;
if (pixel_num % one_percent_pixels == 0) { #pragma omp atomic capture
const uint percent = pixel_num * 100 / total_pixels; this_pixel_count = pixel_count++;
if (this_pixel_count % one_percent_pixels == 0) {
const uint percent = this_pixel_count * 100 / total_pixels;
LOGGER_log(LOGGER_INFO, "Rendering %u%% complete\n", percent); LOGGER_log(LOGGER_INFO, "Rendering %u%% complete\n", percent);
} }
RAY_Ray ray; RAY_Ray ray;