Commit de680b5d authored by Doak, Peter W.'s avatar Doak, Peter W.
Browse files

fix performance regression caused by singleMeasLogging

parent aa2f5698
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -104,7 +104,7 @@ public:
  auto local_G_k_w() const;

  void computeG_k_w(const SpGreensFunction& G0, const SpGreensFunction& M_k_w,
                    SpGreensFunction& G_k_w);
                    SpGreensFunction& G_k_w) const;

  void setSampleConfiguration(const io::Buffer&) {}

@@ -538,7 +538,7 @@ void CtauxClusterSolver<device_t, Parameters, Data, DIST>::symmetrize_measuremen
template <dca::linalg::DeviceType device_t, class Parameters, class Data, DistType DIST>
void CtauxClusterSolver<device_t, Parameters, Data, DIST>::computeG_k_w(const SpGreensFunction& G0,
                                                                        const SpGreensFunction& M_k_w,
                                                                        SpGreensFunction& G_k_w) {
                                                                        SpGreensFunction& G_k_w) const {
  const int matrix_dim = nu::dmn_size();
  dca::linalg::Matrix<std::complex<double>, dca::linalg::CPU> G0_times_M_matrix(
      "GO_M_matrix", matrix_dim, matrix_dim);
+2 −0
Original line number Diff line number Diff line
@@ -81,6 +81,8 @@ public:
    measuring_ = false;
  }

  std::size_t get_meas_id() const { return meas_id_; }

private:
  int thread_id_;
  bool measuring_;
+31 −25
Original line number Diff line number Diff line
@@ -88,7 +88,8 @@ public:
  };

  auto transformMFunction(const MFuncAndSign& mfs) const;
  auto computeSingleMeasurement_G_k_w(const SpGreensFunction& M_k_w);
  auto computeSingleMeasurement_G_k_w(const SpGreensFunction& M_k_w) const ;
  void logSingleMeasurement(StdThreadAccumulatorType& accumulator, int stamping_period, bool log_MFunction) const;

private:
  void startWalker(int id);
@@ -415,7 +416,8 @@ void StdThreadQmciClusterSolver<QmciSolver>::iterateOverLocalMeasurements(
      f(meas_id, n_local_meas, print);
  }
  else {
    throw std::runtime_error("Non fix-meas-per-walker accumulation is suspect and disabled at this time.");
    throw std::runtime_error(
        "Non fix-meas-per-walker accumulation is suspect and disabled at this time.");
    // Perform the total number of loop with a shared atomic counter.
    // for (int meas_id = measurements_done_++; meas_id < n_local_meas; meas_id = measurements_done_++)
    //   f(meas_id, n_local_meas, print);
@@ -434,14 +436,27 @@ auto StdThreadQmciClusterSolver<QmciSolver>::transformMFunction(const MFuncAndSi
// accumulators causing diversion from the normal algorithm. a way to merge this code should be
// found.
template <class QmciSolver>
auto StdThreadQmciClusterSolver<QmciSolver>::computeSingleMeasurement_G_k_w(const SpGreensFunction& M_k_w)
{
auto StdThreadQmciClusterSolver<QmciSolver>::computeSingleMeasurement_G_k_w(
    const SpGreensFunction& M_k_w) const {
  SpGreensFunction G_k_w("G_k_w");
  QmciSolver::computeG_k_w(data_.G0_k_w_cluster_excluded, M_k_w, G_k_w);

  return G_k_w;
}

template <class QmciSolver>
void StdThreadQmciClusterSolver<QmciSolver>::logSingleMeasurement(StdThreadAccumulatorType& accumulator_obj, int stamping_period, bool log_MFunction) const {
  if (accumulator_obj.get_meas_id() % stamping_period == 0) {
    auto mfs = ThisType::getSingleMFunc(accumulator_obj);
    auto M_k_w = ThisType::transformMFunction(mfs);
    auto single_meas_G_k_w = ThisType::computeSingleMeasurement_G_k_w(M_k_w);
    if (log_MFunction)
      accumulator_obj.logPerConfigurationMFunction(M_k_w, mfs.sign);
    accumulator_obj.logPerConfigurationGreensFunction(single_meas_G_k_w);
    accumulator_obj.clearSingleMeasurement();
  }
}

template <class QmciSolver>
void StdThreadQmciClusterSolver<QmciSolver>::startAccumulator(int id, const Parameters& parameters) {
  Profiler::start_threading(id);
@@ -452,7 +467,8 @@ void StdThreadQmciClusterSolver<QmciSolver>::startAccumulator(int id, const Para
  accumulator_obj.initialize(dca_iteration_);

  std::unique_ptr<std::exception> exception_ptr;

  bool log_MFunction = parameters.per_measurement_MFunction();
  auto stamping_period = parameters.stamping_period();
  try {
    while (true) {
      {
@@ -471,15 +487,8 @@ void StdThreadQmciClusterSolver<QmciSolver>::startAccumulator(int id, const Para
      {
        Profiler profiler("accumulating", "stdthread-MC-accumulator", __LINE__, id);
        accumulator_obj.measure();
        if (last_iteration_) {
          auto mfs =  getSingleMFunc(accumulator_obj);
          auto M_k_w = transformMFunction(mfs);
          auto single_meas_G_k_w = computeSingleMeasurement_G_k_w(M_k_w);
          if(parameters.per_measurement_MFunction())
            accumulator_obj.logPerConfigurationMFunction(M_k_w, mfs.sign);
          accumulator_obj.logPerConfigurationGreensFunction(single_meas_G_k_w);
          accumulator_obj.clearSingleMeasurement();
        }
        if (accumulator_log && stamping_period)
          logSingleMeasurement(accumulator_obj, stamping_period, log_MFunction);
        accumulator_obj.finishMeasuring();
      }
    }
@@ -511,7 +520,8 @@ void StdThreadQmciClusterSolver<QmciSolver>::startAccumulator(int id, const Para
}

template <class QmciSolver>
void StdThreadQmciClusterSolver<QmciSolver>::startWalkerAndAccumulator(int id, const Parameters& parameters) {
void StdThreadQmciClusterSolver<QmciSolver>::startWalkerAndAccumulator(int id,
                                                                       const Parameters& parameters) {
  Profiler::start_threading(id);

  // Create and warm a walker.
@@ -531,6 +541,9 @@ void StdThreadQmciClusterSolver<QmciSolver>::startWalkerAndAccumulator(int id, c

  std::unique_ptr<std::exception> current_exception;

  bool log_MFunction = parameters.per_measurement_MFunction();
  auto stamping_period = parameters.stamping_period();

  try {
    iterateOverLocalMeasurements(id, [&](const int meas_id, const int n_meas, const bool print) {
      {
@@ -542,15 +555,8 @@ void StdThreadQmciClusterSolver<QmciSolver>::startWalkerAndAccumulator(int id, c
        accumulator_obj.updateFrom(walker, concurrency_.get_id(), walker.get_thread_id(),
                                   walker.get_meas_id(), last_iteration_);
        accumulator_obj.measure();
        if (last_iteration_) {
          auto mfs = getSingleMFunc(accumulator_obj);
          auto M_k_w = transformMFunction(mfs);
          auto single_meas_G_k_w = computeSingleMeasurement_G_k_w(M_k_w);
          if(parameters.per_measurement_MFunction())
            accumulator_obj.logPerConfigurationMFunction(M_k_w, mfs.sign);
          accumulator_obj.logPerConfigurationGreensFunction(single_meas_G_k_w);
          accumulator_obj.clearSingleMeasurement();
        }
        if (accumulator_log && stamping_period)
          logSingleMeasurement(accumulator_obj, stamping_period, log_MFunction);
        accumulator_obj.finishMeasuring();
      }
      if (print)
+3 −2
Original line number Diff line number Diff line
// Copyright (C) 2018 ETH Zurich
// Copyright (C) 2018 UT-Battelle, LLC
// Copyright (C) 2022 ETH Zurich
// Copyright (C) 2022 UT-Battelle, LLC
// All rights reserved.
//
// See LICENSE.txt for terms of usage.
//  See CITATION.md for citation guidelines, if DCA++ is used for scientific publications.
//
// Author: Giovanni Balduzzi (gbalduzz@itp.phys.ethz.ch)
//         Peter Doak (doakpw@ornl.gov)
//
// No-change test for CT-INT posix wrapper.