From b543a7a4c79c50bc1af27bab36ff823782dffdbb Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Tue, 6 Nov 2012 13:30:25 -0500 Subject: CarpetLib: Add self-checks to MPI reduction operators --- Carpet/CarpetLib/src/dist.cc | 53 +++++++++++++++++++++++++++----------------- 1 file 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 #include +#include #include #include #include @@ -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()) { \ + assert(not done); \ + done = true; \ T *restrict const invec = (T*)invec_; \ T *restrict const inoutvec = (T*)inoutvec_; \ for (int n=0; n()) { \ + assert(not done); \ + done = true; \ T *restrict const invec = (T*)invec_; \ T *restrict const inoutvec = (T*)inoutvec_; \ for (int n=0; n()) { \ + assert(not done); \ + done = true; \ T *restrict const invec = (T*)invec_; \ T *restrict const inoutvec = (T*)inoutvec_; \ for (int n=0; n()) { \ + assert(not done); \ + done = true; \ T *restrict const invec = (T*)invec_; \ T *restrict const inoutvec = (T*)inoutvec_; \ for (int n=0; n()) { \ + assert(not done); \ + done = true; \ T *restrict const invec = (T*)invec_; \ T *restrict const inoutvec = (T*)inoutvec_; \ for (int n=0; n()) { \ + assert(not done); \ + done = true; \ T *restrict const invec = (T*)invec_; \ T *restrict const inoutvec = (T*)inoutvec_; \ for (int n=0; n& in = *(complex*)&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()) { \ + assert(not done); \ + done = true; \ T *restrict const invec = (T*)invec_; \ T *restrict const inoutvec = (T*)inoutvec_; \ for (int n=0; n()) { \ + assert(not done); \ + done = true; \ T *restrict const invec = (T*)invec_; \ T *restrict const inoutvec = (T*)inoutvec_; \ for (int n=0; n