aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetLib/src/dist.cc
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@gmail.com>2012-11-06 13:30:25 -0500
committerErik Schnetter <schnetter@gmail.com>2012-11-06 13:30:25 -0500
commitb543a7a4c79c50bc1af27bab36ff823782dffdbb (patch)
tree0cfade30c88cacd05f202023b740f1bae0b8d600 /Carpet/CarpetLib/src/dist.cc
parent58d4a096a641374a9c6903aff4551752f68a3419 (diff)
CarpetLib: Add self-checks to MPI reduction operators
Diffstat (limited to 'Carpet/CarpetLib/src/dist.cc')
-rw-r--r--Carpet/CarpetLib/src/dist.cc53
1 files changed, 33 insertions, 20 deletions
diff --git a/Carpet/CarpetLib/src/dist.cc b/Carpet/CarpetLib/src/dist.cc
index 77d7f4d1d..66b84c9c3 100644
--- a/Carpet/CarpetLib/src/dist.cc
+++ b/Carpet/CarpetLib/src/dist.cc
@@ -1,6 +1,7 @@
#include <cctk.h>
#include <cctk_Parameters.h>
+#include <algorithm>
#include <cassert>
#include <complex>
#include <typeinfo>
@@ -48,34 +49,37 @@ namespace dist {
int *restrict const len_,
MPI_Datatype *const datatype_)
{
+ bool done = false;
int const len = *len_;
MPI_Datatype const datatype = *datatype_;
#define TYPECASE(N,T) \
if (datatype == mpi_datatype<T>()) { \
+ assert(not done); \
+ done = true; \
T *restrict const invec = (T*)invec_; \
T *restrict const inoutvec = (T*)inoutvec_; \
for (int n=0; n<len; ++n) { \
inoutvec[n] = max(inoutvec[n], invec[n]); \
} \
- } else
+ }
#define CARPET_NO_COMPLEX
#include "typecase.hh"
#undef TYPECASE
#define TYPECASE(N,T) \
if (datatype == mpi_datatype<T>()) { \
+ assert(not done); \
+ done = true; \
T *restrict const invec = (T*)invec_; \
T *restrict const inoutvec = (T*)inoutvec_; \
for (int n=0; n<len; ++n) { \
inoutvec[n].Re = max(inoutvec[n].Re, invec[n].Re); \
inoutvec[n].Im = max(inoutvec[n].Im, invec[n].Im); \
} \
- } else
+ }
#define CARPET_COMPLEX
#include "typecase.hh"
#undef TYPECASE
- {
- assert (0);
- }
+ assert(done);
}
void op_min (void *restrict const invec_,
@@ -83,34 +87,37 @@ namespace dist {
int *restrict const len_,
MPI_Datatype *const datatype_)
{
+ bool done = false;
int const len = *len_;
MPI_Datatype const datatype = *datatype_;
#define TYPECASE(N,T) \
if (datatype == mpi_datatype<T>()) { \
+ assert(not done); \
+ done = true; \
T *restrict const invec = (T*)invec_; \
T *restrict const inoutvec = (T*)inoutvec_; \
for (int n=0; n<len; ++n) { \
inoutvec[n] = min(inoutvec[n], invec[n]); \
} \
- } else
+ }
#define CARPET_NO_COMPLEX
#include "typecase.hh"
#undef TYPECASE
#define TYPECASE(N,T) \
if (datatype == mpi_datatype<T>()) { \
+ assert(not done); \
+ done = true; \
T *restrict const invec = (T*)invec_; \
T *restrict const inoutvec = (T*)inoutvec_; \
for (int n=0; n<len; ++n) { \
inoutvec[n].Re = min(inoutvec[n].Re, invec[n].Re); \
inoutvec[n].Im = min(inoutvec[n].Im, invec[n].Im); \
} \
- } else
+ }
#define CARPET_COMPLEX
#include "typecase.hh"
#undef TYPECASE
- {
- assert (0);
- }
+ assert(done);
}
void op_prod (void *restrict const invec_,
@@ -118,21 +125,26 @@ namespace dist {
int *restrict const len_,
MPI_Datatype *const datatype_)
{
+ bool done = false;
int const len = *len_;
MPI_Datatype const datatype = *datatype_;
#define TYPECASE(N,T) \
if (datatype == mpi_datatype<T>()) { \
+ assert(not done); \
+ done = true; \
T *restrict const invec = (T*)invec_; \
T *restrict const inoutvec = (T*)inoutvec_; \
for (int n=0; n<len; ++n) { \
inoutvec[n] *= invec[n]; \
} \
- } else
+ }
#define CARPET_NO_COMPLEX
#include "typecase.hh"
#undef TYPECASE
#define TYPECASE(N,T) \
if (datatype == mpi_datatype<T>()) { \
+ assert(not done); \
+ done = true; \
T *restrict const invec = (T*)invec_; \
T *restrict const inoutvec = (T*)inoutvec_; \
for (int n=0; n<len; ++n) { \
@@ -140,13 +152,11 @@ namespace dist {
complex<T>& in = *(complex<T>*)&invec[n]; \
inout *= in; \
} \
- } else
+ }
#define CARPET_COMPLEX
#include "typecase.hh"
#undef TYPECASE
- {
- assert (0);
- }
+ assert(done);
}
void op_sum (void *restrict const invec_,
@@ -154,34 +164,37 @@ namespace dist {
int *restrict const len_,
MPI_Datatype *const datatype_)
{
+ bool done = false;
int const len = *len_;
MPI_Datatype const datatype = *datatype_;
#define TYPECASE(N,T) \
if (datatype == mpi_datatype<T>()) { \
+ assert(not done); \
+ done = true; \
T *restrict const invec = (T*)invec_; \
T *restrict const inoutvec = (T*)inoutvec_; \
for (int n=0; n<len; ++n) { \
inoutvec[n] += invec[n]; \
} \
- } else
+ }
#define CARPET_NO_COMPLEX
#include "typecase.hh"
#undef TYPECASE
#define TYPECASE(N,T) \
if (datatype == mpi_datatype<T>()) { \
+ assert(not done); \
+ done = true; \
T *restrict const invec = (T*)invec_; \
T *restrict const inoutvec = (T*)inoutvec_; \
for (int n=0; n<len; ++n) { \
inoutvec[n].Re += invec[n].Re; \
inoutvec[n].Im += invec[n].Im; \
} \
- } else
+ }
#define CARPET_COMPLEX
#include "typecase.hh"
#undef TYPECASE
- {
- assert (0);
- }
+ assert(done);
}