Skip to content

Instantly share code, notes, and snippets.

@jgreitemann
Created March 6, 2017 12:33
Show Gist options
  • Save jgreitemann/e9649178d90f78b07498b250c1364d06 to your computer and use it in GitHub Desktop.
Save jgreitemann/e9649178d90f78b07498b250c1364d06 to your computer and use it in GitHub Desktop.
Demonstration of measurement duplication after repeated collective merge
#include <iostream>
#include <string>
#include <alps/accumulators.hpp>
#include <alps/utilities/mpi.hpp>
#include <alps/hdf5/archive.hpp>
int main (int argc, char *argv[]) {
alps::mpi::environment env(argc, argv, false);
alps::mpi::communicator c;
alps::accumulators::accumulator_set measurements;
measurements << alps::accumulators::MeanAccumulator<double>("dummy");
// measure some data
for (size_t i = c.rank() * 10; i < (c.rank() + 1) * 10; ++i)
measurements["dummy"] << i;
// write checkpoint before collecting
{
std::stringstream ss;
ss << "before_rank_" << c.rank() << ".h5";
alps::hdf5::archive ar(ss.str(), "w");
ar["measurements"] << measurements;
ar.close();
}
// collect results
if (c.rank() == 0) {
measurements["dummy"].collective_merge(c, 0);
alps::accumulators::result_set results;
results.insert("dummy", measurements["dummy"].result());
alps::hdf5::archive ar("results.h5", "w");
ar["/"] << results;
ar.close();
} else {
measurements["dummy"].collective_merge(c, 0);
// resetting slaves manually solves the issue
// measurements["dummy"].reset();
}
// measure some more
for (size_t i = c.rank() * 10; i < (c.rank() + 1) * 10; ++i)
measurements["dummy"] << i;
// final checkpoint
{
std::stringstream ss;
ss << "after_rank_" << c.rank() << ".h5";
alps::hdf5::archive ar(ss.str(), "w");
ar["measurements"] << measurements;
ar.close();
}
// collect results a second time
if (c.rank() == 0) {
measurements["dummy"].collective_merge(c, 0);
alps::accumulators::result_set results;
results.insert("dummy", measurements["dummy"].result());
alps::hdf5::archive ar("results2.h5", "w");
ar["/"] << results;
ar.close();
} else {
measurements["dummy"].collective_merge(c, 0);
// measurements["dummy"].reset();
}
return 0;
}
@jgreitemann
Copy link
Author

results2.h5 will show 110 measurements of dummy and yield the wrong mean of 20.863. Uncommenting line 41 in contrast yield the correct result of 19.5 at 80 samples.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment