Commit aa756ed5 authored by Simon Spannagel's avatar Simon Spannagel
Browse files

ModuleManager: can't get atomic to work with std:;chrono::duration.

Unfortunately makes things even more ugly. :/

(cherry picked from commit 2e8cbd60)
parent 3545f9ea
Loading
Loading
Loading
Loading
+8 −7
Original line number Diff line number Diff line
@@ -343,7 +343,7 @@ std::pair<ModuleIdentifier, Module*> ModuleManager::create_unique_modules(void*
    set_module_after(old_settings);
    // Update execution time
    auto end = std::chrono::steady_clock::now();
    module_execution_time_[module] += std::chrono::duration_cast<std::chrono::microseconds>(end - start);
    module_execution_time_[module] += std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();

    // Set the module directory afterwards to catch invalid access in constructor
    module->get_configuration().set<std::string>("_output_dir", output_dir);
@@ -456,7 +456,7 @@ std::vector<std::pair<ModuleIdentifier, Module*>> ModuleManager::create_detector
        set_module_after(old_settings);
        // Update execution time
        auto end = std::chrono::steady_clock::now();
        module_execution_time_[module] += std::chrono::duration_cast<std::chrono::microseconds>(end - start);
        module_execution_time_[module] += std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();

        // Set the module directory afterwards to catch invalid access in constructor
        module->get_configuration().set<std::string>("_output_dir", output_dir);
@@ -624,7 +624,7 @@ void ModuleManager::initialize() {
        set_module_after(old_settings);
        // Update execution time
        auto end = std::chrono::steady_clock::now();
        module_execution_time_[module.get()] += std::chrono::duration_cast<std::chrono::microseconds>(end - start);
        module_execution_time_[module.get()] += std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    }
    LOG_PROGRESS(STATUS, "INIT_LOOP") << "Initialized " << modules_.size() << " module instantiations";
    auto end_time = std::chrono::steady_clock::now();
@@ -818,7 +818,7 @@ void ModuleManager::run(RandomNumberGenerator& seeder) {
                auto end = std::chrono::steady_clock::now();
                auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end - start);
                // Note: we do not need to lock a mutex because the std::map is not altered and its values are atomic.
                this->module_execution_time_[module.get()] += duration;
                this->module_execution_time_[module.get()] += duration.count();

                if(plot) {
                    std::lock_guard<std::mutex> stat_lock{event->stats_mutex_};
@@ -934,7 +934,7 @@ void ModuleManager::finalize() {
        set_module_after(old_settings);
        // Update execution time
        auto end = std::chrono::steady_clock::now();
        module_execution_time_[module.get()] += std::chrono::duration_cast<std::chrono::microseconds>(end - start);
        module_execution_time_[module.get()] += std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
    }

    // Store performance plots
@@ -1006,7 +1006,7 @@ void ModuleManager::finalize() {
    long double slowest_time = 0, total_module_time = 0;
    std::string slowest_module;
    for(auto& module_exec_time : module_execution_time_) {
        auto module_time = std::chrono::duration<double>(module_exec_time.second).count();
        auto module_time = std::chrono::duration<double>(std::chrono::microseconds(module_exec_time.second)).count();
        total_module_time += module_time;
        if(module_time > slowest_time) {
            slowest_time = module_time;
@@ -1018,7 +1018,8 @@ void ModuleManager::finalize() {
                << "% of time in slowest instantiation " << slowest_module;
    for(auto& module : modules_) {
        LOG(INFO) << " Module " << module->getUniqueName() << " took "
                  << std::chrono::duration<double>(module_execution_time_[module.get()]).count() << " seconds";
                  << std::chrono::duration<double>(std::chrono::microseconds(module_execution_time_[module.get()])).count()
                  << " seconds";
    }

    long double processing_time = 0;
+1 −1
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ namespace allpix {

        std::unique_ptr<TFile> modules_file_;

        std::map<Module*, std::chrono::microseconds> module_execution_time_;
        std::map<Module*, std::atomic_int64_t> module_execution_time_;
        std::map<Module*, Histogram<TH1D>> module_event_time_;
        Histogram<TH1D> event_time_;
        Histogram<TH1D> buffer_fill_level_;