Skip to content

Commit 3707f31

Browse files
Added support for OpenMP.
1 parent aa0d9d9 commit 3707f31

File tree

4 files changed

+29
-16
lines changed

4 files changed

+29
-16
lines changed

include/mcrt/parameter.hh

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
namespace mcrt {
55
struct Parameters {
66
enum class ParallelFramework {
7-
NONE, OPENMP,
8-
OPENMPI, CILK
7+
NONE, OPENMP, OPENMPI
98
};
109

1110
enum class SamplingMethod {

premake5.lua

+6-4
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,12 @@ project (name)
3535
includedirs {"include"}
3636

3737
filter {"system:macosx"}
38-
-- links {"library"}
38+
linkoptions {"-fopenmp"}
39+
buildoptions {"-fopenmp"}
3940
filter {"system:windows"}
40-
-- links {"library"}
41+
linkoptions {"-fopenmp"}
4142
buildoptions {" -static -static-libgcc -static-libstdc++",
42-
"-mwindows", "-mconsole"}
43+
"-mwindows", "-mconsole", "-fopenmp"}
4344
filter {"system:linux or system:bsd"}
44-
-- links {"library"}
45+
linkoptions {"-fopenmp"}
46+
buildoptions {"-fopenmp"}

src/main.cc

+22-9
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ int main(int argc, char** argv) {
5050
if (argc > 3) parameters = mcrt::ParameterImporter::load(argv[3]);
5151
if (argc > 4) return usage(argc, argv); // Now it's just too many.
5252

53+
// Shorthands for enabling or disabling the parallel framework under run-time. TODO: OpenMPI.
54+
bool openmp { parameters.parallelFramework == mcrt::Parameters::ParallelFramework::OPENMP };
55+
5356
// Note that render background will be transparent.
5457
mcrt::Image renderImage { parameters.resolutionWidth,
5558
parameters.resolutionHeight };
@@ -64,24 +67,34 @@ int main(int argc, char** argv) {
6467

6568
// ====================================================
6669

67-
size_t pixelsRendered { 0 };
68-
double renderProgress { 0.0 };
69-
const double pixelCount = renderImage.getSize();
70-
glm::dvec3 eyePoint { sceneCamera.getEyePosition() };
70+
size_t rowsRendered { 0 }; // Shared resource.
71+
const double rowCount = renderImage.getHeight();
72+
const glm::dvec3 eyePoint { sceneCamera.getEyePosition() };
73+
74+
#pragma omp parallel for schedule(dynamic) if (openmp)
75+
for (size_t y = 0; y < renderImage.getHeight(); ++y) {
76+
double renderProgress = rowsRendered / rowCount;
77+
78+
#pragma omp critical
79+
printProgress("Ray tracing: ",
80+
renderProgress);
81+
#pragma omp atomic
82+
++rowsRendered;
7183

72-
for (size_t y { 0 }; y < renderImage.getHeight(); ++y) {
73-
renderProgress = pixelsRendered / pixelCount;
74-
printProgress("Ray tracing: ", renderProgress);
75-
for (size_t x { 0 }; x < renderImage.getWidth(); ++x) {
84+
// ------------------------------------------------
85+
86+
for (size_t x = 0; x < renderImage.getWidth(); ++x) {
7687
// Bit of a hack for now, we probably want to sample from the pixel plane...
7788
glm::dvec3 viewPlanePoint { sceneCamera.getPixelCenter(renderImage, x, y) };
7889
glm::dvec3 rayDirection { glm::normalize(viewPlanePoint - eyePoint) };
7990
mcrt::Ray rayFromViewPlane { viewPlanePoint, rayDirection };
8091

8192
// And also average these pixel color based on the samples.
8293
glm::dvec3 pixelColor { scene.rayTrace(rayFromViewPlane) };
83-
renderImage.pixel(x, y) = pixelColor; ++pixelsRendered;
94+
renderImage.pixel(x, y) = pixelColor;
8495
}
96+
97+
// ------------------------------------------------
8598
}
8699

87100
// ====================================================

src/mcrt/param_import.cc

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ mcrt::Parameters mcrt::ParameterImporter::load(const std::string& file) {
1616
if (parallel == "none") parameters.parallelFramework = Parameters::ParallelFramework::NONE;
1717
else if (parallel == "openmp") parameters.parallelFramework = Parameters::ParallelFramework::OPENMP;
1818
else if (parallel == "openmpi") parameters.parallelFramework = Parameters::ParallelFramework::OPENMPI;
19-
else if (parallel == "cilk") parameters.parallelFramework = Parameters::ParallelFramework::CILK;
2019
else std::runtime_error { "Error: no support for parallel framework '" + parallel + "'!" };
2120
}
2221

0 commit comments

Comments
 (0)