polaroid-pp

Schlieren and contour plot tool
git clone https://git.0xfab.ch/polaroid-pp.git
Log | Files | Refs | Submodules | README | LICENSE

commit fdf9c3291016ea6857af590e00b5e08ef19bb8b1
parent 66aa652249c64052c8f018a4fca6b3c4937d8b0f
Author: Fabian Wermelinger <fabianw@mavt.ethz.ch>
Date:   Fri, 29 Apr 2016 20:51:17 +0200

added missing allreduce

Diffstat:
Mapps/OrganizerMPI.h | 10++++++++++
Mapps/polaroidCamera/BoundedLogNormalizerCartridge.h | 8+++-----
Mapps/polaroidCamera/BoundedTransmissionCartridge.h | 8+++-----
Mapps/polaroidCamera/LogNormalizerCartridge.h | 1+
Mapps/polaroidCamera/NormalizerCartridge.h | 14+-------------
Mapps/polaroidCamera/SceneProcessor.cpp | 20++++++++++++++------
Mapps/polaroidCamera/SceneProcessor.h | 6+++---
Mapps/polaroidCamera/SchlierenCartridge.h | 8+++++---
Mapps/polaroidCamera/polaroidCameraMPI.cpp | 2+-
Minclude/Cartridge.h | 18++++++++++++++++--
10 files changed, 57 insertions(+), 38 deletions(-)

diff --git a/apps/OrganizerMPI.h b/apps/OrganizerMPI.h @@ -9,6 +9,12 @@ #include <vector> #include <mpi.h> +#ifdef _FLOAT_PRECISION_ +#define MPIReal MPI_FLOAT +#else +#define MPIReal MPI_DOUBLE +#endif + class OrganizerMPI { private: @@ -38,6 +44,10 @@ public: inline int argc() const { return m_argc; } inline bool isroot() const { return m_isroot; } inline void wait() const { MPI_Barrier(MPI_COMM_WORLD); } + inline void allreduce(void* send, void* recv, int count, MPI_Datatype type, MPI_Op op) + { + MPI_Allreduce(send, recv, count, type, op, MPI_COMM_WORLD); + } }; #endif /* ORGANIZERMPI_H_8HFBYG90 */ diff --git a/apps/polaroidCamera/BoundedLogNormalizerCartridge.h b/apps/polaroidCamera/BoundedLogNormalizerCartridge.h @@ -9,12 +9,12 @@ #include <cassert> #include <algorithm> #include <cmath> -#include "Cartridge.h" +#include "BoundedNormalizerCartridge.h" -class BoundedLogNormalizerCartridge : public Cartridge +class BoundedLogNormalizerCartridge : public BoundedNormalizerCartridge { public: - BoundedLogNormalizerCartridge(ArgumentParser& parser) : Cartridge(parser) {} + BoundedLogNormalizerCartridge(ArgumentParser& parser) : BoundedNormalizerCartridge(parser) {} virtual void capture(PhotoPaper& photo, Slice& data) { @@ -44,8 +44,6 @@ public: photo.write(); } - - virtual void compute(Slice& data) { } }; #endif /* BOUNDEDLOGNORMALIZERCARTRIDGE_H_QF9H4ZPF */ diff --git a/apps/polaroidCamera/BoundedTransmissionCartridge.h b/apps/polaroidCamera/BoundedTransmissionCartridge.h @@ -7,12 +7,12 @@ #define BOUNDEDTRANSMISSIONCARTRIDGE_H_YDXLKPJU #include <algorithm> -#include "Cartridge.h" +#include "TransmissionCartridge.h" -class BoundedTransmissionCartridge : public Cartridge +class BoundedTransmissionCartridge : public TransmissionCartridge { public: - BoundedTransmissionCartridge(ArgumentParser& parser) : Cartridge(parser) {} + BoundedTransmissionCartridge(ArgumentParser& parser) : TransmissionCartridge(parser) {} virtual void capture(PhotoPaper& photo, Slice& data) { @@ -35,8 +35,6 @@ public: photo.write(); } - - virtual void compute(Slice& data) { } }; #endif /* BOUNDEDTRANSMISSIONCARTRIDGE_H_YDXLKPJU */ diff --git a/apps/polaroidCamera/LogNormalizerCartridge.h b/apps/polaroidCamera/LogNormalizerCartridge.h @@ -7,6 +7,7 @@ #define LOGNORMALIZERCARTRIDGE_H_GEKZAQWI #include <cassert> +#include <cmath> #include "NormalizerCartridge.h" class LogNormalizerCartridge : public NormalizerCartridge diff --git a/apps/polaroidCamera/NormalizerCartridge.h b/apps/polaroidCamera/NormalizerCartridge.h @@ -7,17 +7,12 @@ #define NORMALIZERCARTRIDGE_H_ONAUDSVX #include <algorithm> -#include <cmath> #include "Cartridge.h" class NormalizerCartridge : public Cartridge { -protected: - Real m_dataMin; - Real m_dataMax; - public: - NormalizerCartridge(ArgumentParser& parser) : Cartridge(parser), m_dataMin(HUGE_VAL), m_dataMax(-HUGE_VAL) {} + NormalizerCartridge(ArgumentParser& parser) : Cartridge(parser) {} virtual void capture(PhotoPaper& photo, Slice& data) { @@ -49,13 +44,6 @@ public: m_dataMax = std::max(m_dataMax, data.max()); m_bComputed = true; } - - virtual void reset() - { - m_bComputed = false; - m_dataMin = HUGE_VAL; - m_dataMax = -HUGE_VAL; - } }; #endif /* NORMALIZERCARTRIDGE_H_ONAUDSVX */ diff --git a/apps/polaroidCamera/SceneProcessor.cpp b/apps/polaroidCamera/SceneProcessor.cpp @@ -30,7 +30,7 @@ void SceneProcessor::_prepare_cam() m_cartridge = new SchlierenCartridge(m_parser); else { - if (m_isroot) + if (m_mpi.isroot()) cerr << "ERROR: Unknown cartridge \"" << cart << "\"" << endl; abort(); } @@ -44,7 +44,7 @@ void SceneProcessor::_prepare_cam() m_photo = new PhotoHDF5; else { - if (m_isroot) + if (m_mpi.isroot()) cerr << "ERROR: Unknown photo paper\"" << paper << "\"" << endl; abort(); } @@ -65,7 +65,7 @@ void SceneProcessor::_load_cam(Polaroid& cam, const char* const fname) const cam.load_wavelet(fname, fraction, direction, channel, byte_swap, wavelet_type); else { - if (m_isroot) + if (m_mpi.isroot()) cerr << "ERROR: Undefined input type \"" << input_type << "\"" << endl; abort(); } @@ -87,7 +87,7 @@ void SceneProcessor::process1212(const vector<char*>& scenes) m_photo->make_new(basename+"-polaroid", mycam.width(), mycam.height()); mycam.capture(*m_photo); - if (m_isroot) + if (m_mpi.isroot()) printf("[Progress %3.1f %%]\n", static_cast<double>(i+1)/scenes.size()*100.0); } } @@ -104,10 +104,18 @@ void SceneProcessor::process1122(const vector<char*>& scenes) _load_cam(cam, scenes[i]); cam.insertCartridge(m_cartridge); cam.computeScene(); - if (m_isroot) + if (m_mpi.isroot()) printf("[Scene Progress %3.1f %%]\n", static_cast<double>(i+1)/scenes.size()*100.0); } + Real globalMin, globalMax; + Real myMin = m_cartridge->min(); + Real myMax = m_cartridge->max(); + m_mpi.allreduce(&myMin, &globalMin, 1, MPIReal, MPI_MIN); + m_mpi.allreduce(&myMax, &globalMax, 1, MPIReal, MPI_MAX); + m_cartridge->set_min(globalMin); + m_cartridge->set_max(globalMax); + // 2.)apply pixel shader and write photo for (size_t i=0; i<scenes.size(); ++i) { @@ -120,7 +128,7 @@ void SceneProcessor::process1122(const vector<char*>& scenes) m_photo->make_new(basename+"-polaroid", cam.width(), cam.height()); cam.capture(*m_photo); - if (m_isroot) + if (m_mpi.isroot()) printf("[Shader Progress %3.1f %%]\n", static_cast<double>(i+1)/scenes.size()*100.0); } } diff --git a/apps/polaroidCamera/SceneProcessor.h b/apps/polaroidCamera/SceneProcessor.h @@ -9,6 +9,7 @@ #include <vector> #include "ArgumentParser.h" +#include "OrganizerMPI.h" #include "Polaroid.h" #include "Cartridges.h" #include "PhotoFormats.h" @@ -17,11 +18,10 @@ class SceneProcessor { private: ArgumentParser& m_parser; + OrganizerMPI& m_mpi; Cartridge* m_cartridge; PhotoPaper* m_photo; - const bool m_isroot; - // helper void _prepare_cam(); void _load_cam(Polaroid& cam, const char* const fname) const; @@ -34,7 +34,7 @@ private: } public: - SceneProcessor(ArgumentParser& parser, const bool isroot=true) : m_parser(parser), m_cartridge(nullptr), m_photo(nullptr), m_isroot(isroot) {} + SceneProcessor(ArgumentParser& parser, OrganizerMPI& mpi) : m_parser(parser), m_mpi(mpi), m_cartridge(nullptr), m_photo(nullptr) {} ~SceneProcessor() { _dispose(); } void process1212(const std::vector<char*>& scenes); diff --git a/apps/polaroidCamera/SchlierenCartridge.h b/apps/polaroidCamera/SchlierenCartridge.h @@ -6,9 +6,11 @@ #ifndef SCHLIERENCARTRIDGE_H_AUHX7ILM #define SCHLIERENCARTRIDGE_H_AUHX7ILM -#include "NormalizerCartridge.h" +#include <algorithm> +#include <cmath> +#include "Cartridge.h" -class SchlierenCartridge : public NormalizerCartridge +class SchlierenCartridge : public Cartridge { Slice m_gradX; Slice m_gradY; @@ -19,7 +21,7 @@ class SchlierenCartridge : public NormalizerCartridge void _gradY(const Slice& data); public: - SchlierenCartridge(ArgumentParser& parser) : NormalizerCartridge(parser) {} + SchlierenCartridge(ArgumentParser& parser) : Cartridge(parser) {} virtual void capture(PhotoPaper& photo, Slice& data) { diff --git a/apps/polaroidCamera/polaroidCameraMPI.cpp b/apps/polaroidCamera/polaroidCameraMPI.cpp @@ -37,7 +37,7 @@ int main(int argc, char* argv[]) else printf("[Worker %d/%d: Load = %d scene(s), start @ %s]\n", worker.rank(), worker.size(), myscenes.size(), "none"); - SceneProcessor myprocessor(myparser, worker.isroot()); + SceneProcessor myprocessor(myparser, worker); if (myparser("-process").asInt(1212) == 1212) myprocessor.process1212(myscenes); diff --git a/include/Cartridge.h b/include/Cartridge.h @@ -6,6 +6,7 @@ #ifndef CARTRIDGE_H_IRUVKOCT #define CARTRIDGE_H_IRUVKOCT +#include <cmath> #include "ArgumentParser.h" #include "Types.h" #include "PhotoPaper.h" @@ -16,13 +17,26 @@ protected: ArgumentParser& m_parser; bool m_bComputed; + Real m_dataMin; + Real m_dataMax; + public: - Cartridge(ArgumentParser& parser) : m_parser(parser), m_bComputed(false) {} + Cartridge(ArgumentParser& parser) : m_parser(parser), m_bComputed(false), m_dataMin(HUGE_VAL), m_dataMax(-HUGE_VAL) {} virtual ~Cartridge() {} virtual void capture(PhotoPaper& photo, Slice& data) = 0; virtual void compute(Slice& data) = 0; - virtual void reset() { m_bComputed = false; } + virtual void reset() + { + m_bComputed = false; + m_dataMin = HUGE_VAL; + m_dataMax = -HUGE_VAL; + } + + inline Real min() const { return m_dataMin; } + inline Real max() const { return m_dataMax; } + inline void set_min(const Real v) { m_dataMin = v; } + inline void set_max(const Real v) { m_dataMax = v; } }; #endif /* CARTRIDGE_H_IRUVKOCT */