commit fdf9c3291016ea6857af590e00b5e08ef19bb8b1
parent 66aa652249c64052c8f018a4fca6b3c4937d8b0f
Author: Fabian Wermelinger <fabianw@mavt.ethz.ch>
Date: Fri, 29 Apr 2016 20:51:17 +0200
added missing allreduce
Diffstat:
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 */