Loading include/dca/phys/dca_step/cluster_solver/ctaux/ctaux_cluster_solver.hpp +2 −2 Original line number Diff line number Diff line Loading @@ -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&) {} Loading Loading @@ -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); Loading include/dca/phys/dca_step/cluster_solver/stdthread_qmci/stdthread_qmci_accumulator.hpp +2 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,8 @@ public: measuring_ = false; } std::size_t get_meas_id() const { return meas_id_; } private: int thread_id_; bool measuring_; Loading include/dca/phys/dca_step/cluster_solver/stdthread_qmci/stdthread_qmci_cluster_solver.hpp +31 −25 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading @@ -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); Loading @@ -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) { { Loading @@ -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(); } } Loading Loading @@ -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. Loading @@ -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) { { Loading @@ -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) Loading test/integration/cluster_solver/stdthread_qmci/stdthread_ctint_cluster_solver_test.cpp +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. Loading Loading
include/dca/phys/dca_step/cluster_solver/ctaux/ctaux_cluster_solver.hpp +2 −2 Original line number Diff line number Diff line Loading @@ -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&) {} Loading Loading @@ -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); Loading
include/dca/phys/dca_step/cluster_solver/stdthread_qmci/stdthread_qmci_accumulator.hpp +2 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,8 @@ public: measuring_ = false; } std::size_t get_meas_id() const { return meas_id_; } private: int thread_id_; bool measuring_; Loading
include/dca/phys/dca_step/cluster_solver/stdthread_qmci/stdthread_qmci_cluster_solver.hpp +31 −25 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading @@ -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); Loading @@ -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) { { Loading @@ -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(); } } Loading Loading @@ -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. Loading @@ -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) { { Loading @@ -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) Loading
test/integration/cluster_solver/stdthread_qmci/stdthread_ctint_cluster_solver_test.cpp +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. Loading