CMS 3D CMS Logo

FastTimerService.h
Go to the documentation of this file.
1 #ifndef FastTimerService_h
2 #define FastTimerService_h
3 
4 // system headers
5 #include <unistd.h>
6 #include <pthread.h>
7 
8 // C++ headers
9 #include <chrono>
10 #include <cmath>
11 #include <map>
12 #include <mutex>
13 #include <string>
14 #include <unordered_map>
15 
16 // boost headers
17 #include <boost/chrono.hpp>
18 
19 // tbb headers
20 #include <oneapi/tbb/concurrent_unordered_set.h>
21 #include <oneapi/tbb/enumerable_thread_specific.h>
22 #include <oneapi/tbb/task_scheduler_observer.h>
23 
24 // JSON headers
25 #include <nlohmann/json_fwd.hpp>
27 
28 // CMSSW headers
48 
49 /*
50 procesing time is divided into
51  - source
52  - event processing, sum of the time spent in all the modules
53 */
54 
55 class FastTimerService : public tbb::task_scheduler_observer {
56 public:
58  ~FastTimerService() override = default;
59 
60 private:
61  void ignoredSignal(const std::string& signal) const;
62  void unsupportedSignal(const std::string& signal) const;
63 
64  // these signal pairs are not guaranteed to happen in the same thread
65 
67 
69  void postBeginJob();
70 
71  void postEndJob();
72 
75 
78 
81 
84 
87 
90 
93 
96 
97  void preEvent(edm::StreamContext const&);
98  void postEvent(edm::StreamContext const&);
99 
100  void prePathEvent(edm::StreamContext const&, edm::PathContext const&);
102 
105 
106  // these signal pairs are guaranteed to be called within the same thread
107 
108  //void preOpenFile(std::string const&, bool);
109  //void postOpenFile(std::string const&, bool);
110 
111  //void preCloseFile(std::string const&, bool);
112  //void postCloseFile(std::string const&, bool);
113 
115  //void postSourceConstruction(edm::ModuleDescription const&);
116 
119 
122 
125 
126  //void preModuleConstruction(edm::ModuleDescription const&);
127  //void postModuleConstruction(edm::ModuleDescription const&);
128 
129  //void preModuleBeginJob(edm::ModuleDescription const&);
130  //void postModuleBeginJob(edm::ModuleDescription const&);
131 
132  //void preModuleEndJob(edm::ModuleDescription const&);
133  //void postModuleEndJob(edm::ModuleDescription const&);
134 
135  //void preModuleBeginStream(edm::StreamContext const&, edm::ModuleCallingContext const&);
136  //void postModuleBeginStream(edm::StreamContext const&, edm::ModuleCallingContext const&);
137 
138  //void preModuleEndStream(edm::StreamContext const&, edm::ModuleCallingContext const&);
139  //void postModuleEndStream(edm::StreamContext const&, edm::ModuleCallingContext const&);
140 
143 
146 
149 
152 
155 
158 
161 
164 
167 
170 
173 
176 
179 
180  // inherited from TBB task_scheduler_observer
181  void on_scheduler_entry(bool worker) final;
182  void on_scheduler_exit(bool worker) final;
183 
184 public:
185  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
186  static void fixForDQM(std::string& label);
187 
188 private:
189  // forward declarations
190  struct Resources;
191  struct AtomicResources;
192 
193  // per-thread measurements
194  struct Measurement {
195  public:
196  Measurement() noexcept;
197  // take per-thread measurements
198  void measure() noexcept;
199  // take per-thread measurements, compute the delta with respect to the previous measurement, and store them in the argument
200  void measure_and_store(Resources& store) noexcept;
201  // take per-thread measurements, compute the delta with respect to the previous measurement, and add them to the argument
202  void measure_and_accumulate(Resources& store) noexcept;
203  void measure_and_accumulate(AtomicResources& store) noexcept;
204 
205  public:
206 #ifdef DEBUG_THREAD_CONCURRENCY
208 #endif // DEBUG_THREAD_CONCURRENCY
209  boost::chrono::thread_clock::time_point time_thread;
210  boost::chrono::high_resolution_clock::time_point time_real;
213  };
214 
215  // highlight a group of modules
216  struct GroupOfModules {
217  public:
219  std::vector<unsigned int> modules;
220  };
221 
222  // resources being monitored by the service
223  struct Resources {
224  public:
225  Resources();
226  void reset();
227 
229  Resources& operator+=(struct AtomicResources const& other);
230  Resources operator+(Resources const& other) const;
231  Resources operator+(struct AtomicResources const& other) const;
232 
233  public:
238  };
239 
240  // atomic version of Resources
241  // Note: the structure as a whole is *not* atomic, only the individual fields are
243  public:
244  AtomicResources();
246  void reset();
247 
252  Resources operator+(Resources const& other) const;
253 
254  public:
255  std::atomic<boost::chrono::nanoseconds::rep> time_thread;
256  std::atomic<boost::chrono::nanoseconds::rep> time_real;
257  std::atomic<uint64_t> allocated;
258  std::atomic<uint64_t> deallocated;
259  };
260 
261  // resources associated to each module, path, process and job
262 
264  public:
265  ResourcesPerModule() noexcept;
266  void reset() noexcept;
267 
270 
271  public:
273  unsigned events;
274  bool has_acquire; // whether this module has an acquire() method
275  };
276 
278  public:
279  void reset();
282 
283  public:
284  Resources active; // resources used by all modules on this path
285  Resources total; // resources used by all modules on this path, and their dependencies
286  unsigned last; // one-past-the last module that ran on this path
287  bool status; // whether the path accepted or rejected the event
288  };
289 
291  public:
293  void reset();
296 
297  public:
299  std::vector<ResourcesPerPath> paths;
300  std::vector<ResourcesPerPath> endpaths;
301  };
302 
304  public:
305  ResourcesPerJob() = default;
306  ResourcesPerJob(ProcessCallGraph const& job, std::vector<GroupOfModules> const& groups);
307  void reset();
310 
311  public:
315  Resources event; // total time etc. spent between preSourceEvent and postEvent
317  std::vector<Resources> highlight;
318  std::vector<ResourcesPerModule> modules;
319  std::vector<ResourcesPerProcess> processes;
320  unsigned events;
321  };
322 
323  // plot ranges and resolution
324  struct PlotRanges {
325  double time_range;
327  double memory_range;
329  };
330 
331  // plots associated to each module or other element (path, process, etc)
333  public:
334  PlotsPerElement() = default;
336  std::string const& name,
337  std::string const& title,
338  PlotRanges const& ranges,
339  unsigned int lumisections,
340  bool byls);
341  void fill(Resources const&, unsigned int lumisection);
342  void fill(AtomicResources const&, unsigned int lumisection);
343  void fill_fraction(Resources const&, Resources const&, unsigned int lumisection);
344 
345  private:
346  // resources spent in the module
355  };
356 
357  // plots associated to each path or endpath
358  class PlotsPerPath {
359  public:
360  PlotsPerPath() = default;
362  std::string const&,
363  ProcessCallGraph const&,
365  PlotRanges const& ranges,
366  unsigned int lumisections,
367  bool byls);
368  void fill(ProcessCallGraph::PathType const&,
369  ResourcesPerJob const&,
370  ResourcesPerPath const&,
371  unsigned int lumisection);
372 
373  private:
374  // resources spent in all the modules in the path, including their dependencies
376 
377  // Note:
378  // a TH1F has 7 significant digits, while a 24-hour long run could process
379  // order of 10 billion events; a 64-bit long integer would work and might
380  // be better suited than a double, but there is no "TH1L" in ROOT.
381 
382  // how many times each module and their dependencies has run
384  // resources spent in each module and their dependencies
389  };
390 
392  public:
395  ProcessCallGraph const&,
397  PlotRanges const& event_ranges,
398  PlotRanges const& path_ranges,
399  unsigned int lumisections,
400  bool bypath,
401  bool byls);
402  void fill(ProcessCallGraph::ProcessType const&, ResourcesPerJob const&, ResourcesPerProcess const&, unsigned int ls);
403 
404  private:
405  // resources spent in all the modules of the (sub)process
407  // resources spent in each path and endpath
408  std::vector<PlotsPerPath> paths_;
409  std::vector<PlotsPerPath> endpaths_;
410  };
411 
412  class PlotsPerJob {
413  public:
414  PlotsPerJob(ProcessCallGraph const& job, std::vector<GroupOfModules> const& groups);
416  ProcessCallGraph const&,
417  std::vector<GroupOfModules> const&,
418  PlotRanges const& event_ranges,
419  PlotRanges const& path_ranges,
420  PlotRanges const& module_ranges,
421  unsigned int lumisections,
422  bool bymodule,
423  bool bypath,
424  bool byls,
425  bool transitions);
426  void fill(ProcessCallGraph const&, ResourcesPerJob const&, unsigned int ls);
427  void fill_run(AtomicResources const&);
428  void fill_lumi(AtomicResources const&, unsigned int lumisection);
429 
430  private:
431  // resources spent in all the modules of the job
435  // resources spent in the modules' lumi and run transitions
438  // resources spent in the highlighted modules
439  std::vector<PlotsPerElement> highlight_;
440  // resources spent in each module
441  std::vector<PlotsPerElement> modules_;
442  // resources spent in each (sub)process
443  std::vector<PlotsPerProcess> processes_;
444  };
445 
446  // keep track of the dependencies among modules
448 
449  // per-stream information
450  std::vector<ResourcesPerJob> streams_;
451 
452  // concurrent histograms and profiles
453  std::unique_ptr<PlotsPerJob> plots_;
454 
455  // per-lumi and per-run information
456  std::vector<AtomicResources> lumi_transition_; // resources spent in the modules' global and stream lumi transitions
457  std::vector<AtomicResources> run_transition_; // resources spent in the modules' global and stream run transitions
458  AtomicResources overhead_; // resources spent outside of the modules' transitions
459 
460  // summary data
461  ResourcesPerJob job_summary_; // whole event time accounting per-job
462  std::vector<ResourcesPerJob> run_summary_; // whole event time accounting per-run
463  std::mutex summary_mutex_; // synchronise access to the summary objects across different threads
464 
465  //
466  struct ThreadGuard {
467  struct specific_t {
469  ~specific_t() = default;
470 
473  std::atomic<bool> live_;
474  };
475 
476  ThreadGuard();
477  ~ThreadGuard() = default;
478 
479  static void retire_thread(void* t);
480  static std::shared_ptr<specific_t>* ptr(void* p);
481 
483  Measurement& thread();
484  void finalize();
485 
486  tbb::concurrent_vector<std::shared_ptr<specific_t>> thread_resources_;
487  pthread_key_t key_;
488  };
489 
490  //
492 
493  // atomic variables to keep track of the completion of each step, process by process
494  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_event_check_;
495  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_global_lumi_check_;
496  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_global_run_check_;
497 
498  // retrieve the current thread's per-thread quantities
499  Measurement& thread();
500 
501  // job configuration
502  unsigned int concurrent_lumis_;
503  unsigned int concurrent_runs_;
504  unsigned int concurrent_streams_;
505  unsigned int concurrent_threads_;
506 
507  // logging configuration
508  const bool print_event_summary_; // print the time spent in each process, path and module after every event
509  const bool print_run_summary_; // print the time spent in each process, path and module for each run
510  const bool print_job_summary_; // print the time spent in each process, path and module for the whole job
511 
512  // JSON configuration
513  //const bool write_json_per_event_;
514  //const bool write_json_per_ls_;
515  //const bool write_json_per_run_;
518 
519  // dqm configuration
520  bool enable_dqm_; // non const, depends on the availability of the DQMStore
522  const bool enable_dqm_bypath_;
523  const bool enable_dqm_byls_;
526 
530  const unsigned int dqm_lumisections_range_;
532 
533  std::vector<edm::ParameterSet> highlight_module_psets_; // non-const, cleared in postBeginJob()
534  std::vector<GroupOfModules> highlight_modules_; // non-const, filled in postBeginJob()
535 
536  // log unsupported signals
537  mutable tbb::concurrent_unordered_set<std::string> unsupported_signals_; // keep track of unsupported signals received
538 
539  // print the resource usage summary for en event, a run, or the while job
540  template <typename T>
541  void printHeader(T& out, std::string const& label) const;
542 
543  template <typename T>
544  void printEventHeader(T& out, std::string const& label) const;
545 
546  template <typename T>
547  void printEventLine(T& out, Resources const& data, std::string const& label) const;
548 
549  template <typename T>
550  void printEventLine(T& out, AtomicResources const& data, std::string const& label) const;
551 
552  template <typename T>
553  void printEvent(T& out, ResourcesPerJob const&) const;
554 
555  template <typename T>
556  void printSummaryHeader(T& out, std::string const& label, bool detailed) const;
557 
558  template <typename T>
559  void printPathSummaryHeader(T& out, std::string const& label) const;
560 
561  template <typename T>
562  void printSummaryLine(T& out, Resources const& data, uint64_t events, std::string const& label) const;
563 
564  template <typename T>
565  void printSummaryLine(T& out, Resources const& data, uint64_t events, uint64_t active, std::string const& label) const;
566 
567  template <typename T>
568  void printSummaryLine(T& out, AtomicResources const& data, uint64_t events, std::string const& label) const;
569 
570  template <typename T>
571  void printSummaryLine(
572  T& out, AtomicResources const& data, uint64_t events, uint64_t active, std::string const& label) const;
573 
574  template <typename T>
576  T& out, Resources const& data, Resources const& total, uint64_t events, std::string const& label) const;
577 
578  template <typename T>
579  void printSummary(T& out, ResourcesPerJob const& data, std::string const& label) const;
580 
581  template <typename T>
582  void printTransition(T& out, AtomicResources const& data, std::string const& label) const;
583 
584  template <typename T>
585  json encodeToJSON(std::string const& type, std::string const& label, unsigned int events, T const& data) const;
586 
588 
589  void writeSummaryJSON(ResourcesPerJob const& data, std::string const& filename) const;
590 
591  // check if this is the first process being signalled
594 
595  // check if this is the lest process being signalled
596  bool isLastSubprocess(std::atomic<unsigned int>& check);
597 };
598 
599 #endif // ! FastTimerService_h
void preGlobalBeginRun(edm::GlobalContext const &)
void preModuleEventDelayedGet(edm::StreamContext const &, edm::ModuleCallingContext const &)
const bool print_run_summary_
void fill(Resources const &, unsigned int lumisection)
ResourcesPerProcess operator+(ResourcesPerProcess const &other) const
std::unique_ptr< std::atomic< unsigned int >[]> subprocess_global_lumi_check_
void postStreamBeginRun(edm::StreamContext const &)
void postGlobalEndLumi(edm::GlobalContext const &)
void postGlobalBeginLumi(edm::GlobalContext const &)
void on_scheduler_entry(bool worker) final
void postStreamEndLumi(edm::StreamContext const &)
void on_scheduler_exit(bool worker) final
std::vector< edm::ParameterSet > highlight_module_psets_
void postModuleGlobalEndLumi(edm::GlobalContext const &, edm::ModuleCallingContext const &)
void preEventReadFromSource(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preGlobalEndRun(edm::GlobalContext const &)
void preBeginJob(edm::PathsAndConsumesOfModulesBase const &, edm::ProcessContext const &)
void fill_lumi(AtomicResources const &, unsigned int lumisection)
void preSourceLumi(edm::LuminosityBlockIndex)
void printSummary(T &out, ResourcesPerJob const &data, std::string const &label) const
boost::date_time::subsecond_duration< boost::posix_time::time_duration, 1000000000 > nanoseconds
ResourcesPerJob operator+(ResourcesPerJob const &other) const
dqm::reco::MonitorElement * deallocated_byls_
unsigned int concurrent_threads_
void postEventReadFromSource(edm::StreamContext const &, edm::ModuleCallingContext const &)
const PlotRanges dqm_event_ranges_
void postModuleGlobalEndRun(edm::GlobalContext const &, edm::ModuleCallingContext const &)
void preSourceRun(edm::RunIndex)
void postModuleEvent(edm::StreamContext const &, edm::ModuleCallingContext const &)
void unsupportedSignal(const std::string &signal) const
void writeSummaryJSON(ResourcesPerJob const &data, std::string const &filename) const
std::vector< GroupOfModules > highlight_modules_
const bool write_json_summary_
void book(dqm::reco::DQMStore::IBooker &, ProcessCallGraph const &, ProcessCallGraph::ProcessType const &, PlotRanges const &event_ranges, PlotRanges const &path_ranges, unsigned int lumisections, bool bypath, bool byls)
ResourcesPerJob job_summary_
dqm::reco::MonitorElement * module_deallocated_total_
PlotsPerJob(ProcessCallGraph const &job, std::vector< GroupOfModules > const &groups)
nlohmann::json json
PlotsPerProcess(ProcessCallGraph::ProcessType const &)
std::vector< unsigned int > modules
void preGlobalEndLumi(edm::GlobalContext const &)
std::vector< ResourcesPerPath > endpaths
static std::mutex mutex
Definition: Proxy.cc:8
AtomicResources overhead_
void preESModule(edm::eventsetup::EventSetupRecordKey const &, edm::ESModuleCallingContext const &)
const std::string json_filename_
bool isFirstSubprocess(edm::StreamContext const &)
const bool enable_dqm_bynproc_
void postESModule(edm::eventsetup::EventSetupRecordKey const &, edm::ESModuleCallingContext const &)
unsigned int concurrent_runs_
boost::chrono::nanoseconds time_real
std::atomic< uint64_t > deallocated
std::unique_ptr< std::atomic< unsigned int >[]> subprocess_global_run_check_
void postSourceRun(edm::RunIndex)
std::vector< ResourcesPerJob > streams_
dqm::reco::MonitorElement * time_thread_byls_
std::atomic< uint64_t > allocated
nlohmann::json json
void postPathEvent(edm::StreamContext const &, edm::PathContext const &, edm::HLTPathStatus const &)
std::vector< PlotsPerElement > highlight_
void preModuleGlobalBeginLumi(edm::GlobalContext const &, edm::ModuleCallingContext const &)
dqm::reco::MonitorElement * time_thread_
ResourcesPerProcess & operator+=(ResourcesPerProcess const &other)
void book(dqm::reco::DQMStore::IBooker &, std::string const &, ProcessCallGraph const &, ProcessCallGraph::PathType const &, PlotRanges const &ranges, unsigned int lumisections, bool byls)
const bool print_job_summary_
const bool enable_dqm_bypath_
void book(dqm::reco::DQMStore::IBooker &, ProcessCallGraph const &, std::vector< GroupOfModules > const &, PlotRanges const &event_ranges, PlotRanges const &path_ranges, PlotRanges const &module_ranges, unsigned int lumisections, bool bymodule, bool bypath, bool byls, bool transitions)
AtomicResources operator+(AtomicResources const &other) const
Measurement & thread()
void postStreamBeginLumi(edm::StreamContext const &)
dqm::reco::MonitorElement * deallocated_
dqm::reco::MonitorElement * time_real_
const PlotRanges dqm_path_ranges_
boost::chrono::thread_clock::time_point time_thread
std::vector< ResourcesPerModule > modules
char const * label
void postModuleStreamEndLumi(edm::StreamContext const &, edm::ModuleCallingContext const &)
std::mutex summary_mutex_
ResourcesPerJob & operator+=(ResourcesPerJob const &other)
void fill(ProcessCallGraph::ProcessType const &, ResourcesPerJob const &, ResourcesPerProcess const &, unsigned int ls)
ResourcesPerModule operator+(ResourcesPerModule const &other) const
void printEvent(T &out, ResourcesPerJob const &) const
void prePathEvent(edm::StreamContext const &, edm::PathContext const &)
dqm::reco::MonitorElement * module_time_thread_total_
std::vector< ResourcesPerJob > run_summary_
dqm::reco::MonitorElement * time_real_byls_
~FastTimerService() override=default
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
FastTimerService(const edm::ParameterSet &, edm::ActivityRegistry &)
void preModuleStreamEndLumi(edm::StreamContext const &, edm::ModuleCallingContext const &)
void postEvent(edm::StreamContext const &)
void postGlobalEndRun(edm::GlobalContext const &)
std::unique_ptr< std::atomic< unsigned int >[]> subprocess_event_check_
void fill_fraction(Resources const &, Resources const &, unsigned int lumisection)
const unsigned int dqm_lumisections_range_
void postStreamEndRun(edm::StreamContext const &)
void preModuleEvent(edm::StreamContext const &, edm::ModuleCallingContext const &)
ResourcesPerPath & operator+=(ResourcesPerPath const &other)
std::vector< PlotsPerElement > modules_
Resources operator+(Resources const &other) const
unsigned int concurrent_lumis_
void printSummaryLine(T &out, Resources const &data, uint64_t events, std::string const &label) const
std::string dqm_path_
bool register_thread(FastTimerService::AtomicResources &r)
dqm::reco::MonitorElement * module_time_real_total_
void printPathSummaryLine(T &out, Resources const &data, Resources const &total, uint64_t events, std::string const &label) const
json encodeToJSON(std::string const &type, std::string const &label, unsigned int events, T const &data) const
const bool enable_dqm_transitions_
void printSummaryHeader(T &out, std::string const &label, bool detailed) const
void ignoredSignal(const std::string &signal) const
std::atomic< boost::chrono::nanoseconds::rep > time_thread
void measure_and_store(Resources &store) noexcept
std::vector< Resources > highlight
const bool enable_dqm_bymodule_
string ranges
Definition: diffTwoXMLs.py:79
void book(dqm::reco::DQMStore::IBooker &, std::string const &name, std::string const &title, PlotRanges const &ranges, unsigned int lumisections, bool byls)
void fill_run(AtomicResources const &)
const PlotRanges dqm_module_ranges_
std::vector< PlotsPerPath > endpaths_
const bool enable_dqm_byls_
def ls(path, rec=False)
Definition: eostools.py:349
std::vector< PlotsPerProcess > processes_
void postModuleEventAcquire(edm::StreamContext const &, edm::ModuleCallingContext const &)
void postModuleEventDelayedGet(edm::StreamContext const &, edm::ModuleCallingContext const &)
const bool print_event_summary_
boost::chrono::high_resolution_clock::time_point time_real
dqm::reco::MonitorElement * allocated_byls_
static std::shared_ptr< specific_t > * ptr(void *p)
unsigned long long uint64_t
Definition: Time.h:13
tbb::concurrent_vector< std::shared_ptr< specific_t > > thread_resources_
void postModuleStreamBeginLumi(edm::StreamContext const &, edm::ModuleCallingContext const &)
std::vector< AtomicResources > run_transition_
void preModuleStreamEndRun(edm::StreamContext const &, edm::ModuleCallingContext const &)
void postModuleStreamEndRun(edm::StreamContext const &, edm::ModuleCallingContext const &)
void printEventHeader(T &out, std::string const &label) const
void postModuleStreamBeginRun(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preSourceEvent(edm::StreamID)
static void retire_thread(void *t)
boost::chrono::nanoseconds time_thread
void preEvent(edm::StreamContext const &)
void postGlobalBeginRun(edm::GlobalContext const &)
void printEventLine(T &out, Resources const &data, std::string const &label) const
void preStreamBeginLumi(edm::StreamContext const &)
ResourcesPerProcess(ProcessCallGraph::ProcessType const &process)
void postSourceEvent(edm::StreamID)
dqm::reco::MonitorElement * allocated_
void preModuleStreamBeginLumi(edm::StreamContext const &, edm::ModuleCallingContext const &)
void printPathSummaryHeader(T &out, std::string const &label) const
void preStreamEndRun(edm::StreamContext const &)
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
std::atomic< boost::chrono::nanoseconds::rep > time_real
void preModuleStreamBeginRun(edm::StreamContext const &, edm::ModuleCallingContext const &)
void printHeader(T &out, std::string const &label) const
void preStreamEndLumi(edm::StreamContext const &)
void measure_and_accumulate(Resources &store) noexcept
ResourcesPerModule & operator+=(ResourcesPerModule const &other)
void postModuleEventPrefetching(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preModuleGlobalEndLumi(edm::GlobalContext const &, edm::ModuleCallingContext const &)
std::unique_ptr< PlotsPerJob > plots_
ResourcesPerPath operator+(ResourcesPerPath const &other) const
void preGlobalBeginLumi(edm::GlobalContext const &)
AtomicResources & operator+=(AtomicResources const &other)
Resources & operator+=(Resources const &other)
void preModuleEventPrefetching(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preSourceConstruction(edm::ModuleDescription const &)
void preModuleEventAcquire(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preModuleGlobalEndRun(edm::GlobalContext const &, edm::ModuleCallingContext const &)
dqm::reco::MonitorElement * module_allocated_total_
tbb::concurrent_unordered_set< std::string > unsupported_signals_
std::vector< PlotsPerPath > paths_
void printTransition(T &out, AtomicResources const &data, std::string const &label) const
void postSourceLumi(edm::LuminosityBlockIndex)
void postModuleGlobalBeginRun(edm::GlobalContext const &, edm::ModuleCallingContext const &)
std::vector< ResourcesPerProcess > processes
AtomicResources & operator=(AtomicResources const &other)
ProcessCallGraph callgraph_
long double T
void postModuleGlobalBeginLumi(edm::GlobalContext const &, edm::ModuleCallingContext const &)
void preStreamBeginRun(edm::StreamContext const &)
dqm::reco::MonitorElement * module_counter_
std::vector< ResourcesPerPath > paths
void preModuleGlobalBeginRun(edm::GlobalContext const &, edm::ModuleCallingContext const &)
std::vector< AtomicResources > lumi_transition_
int events
static void fixForDQM(std::string &label)
unsigned int concurrent_streams_
bool isLastSubprocess(std::atomic< unsigned int > &check)
void preallocate(edm::service::SystemBounds const &)
void fill(ProcessCallGraph const &, ResourcesPerJob const &, unsigned int ls)
void fill(ProcessCallGraph::PathType const &, ResourcesPerJob const &, ResourcesPerPath const &, unsigned int lumisection)