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 from 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:
316  Resources event; // total time etc. spent between preSourceEvent and postEvent
318  std::vector<Resources> highlight;
319  std::vector<ResourcesPerModule> modules;
320  std::vector<ResourcesPerProcess> processes;
321  unsigned events;
322  };
323 
324  // plot ranges and resolution
325  struct PlotRanges {
326  double time_range;
328  double memory_range;
330  };
331 
332  // plots associated to each module or other element (path, process, etc)
334  public:
335  PlotsPerElement() = default;
337  std::string const& name,
338  std::string const& title,
339  PlotRanges const& ranges,
340  unsigned int lumisections,
341  bool byls);
342  void fill(Resources const&, unsigned int lumisection);
343  void fill(AtomicResources const&, unsigned int lumisection);
344  void fill_fraction(Resources const&, Resources const&, unsigned int lumisection);
345 
346  private:
347  // resources spent in the module
356  };
357 
358  // plots associated to each path or endpath
359  class PlotsPerPath {
360  public:
361  PlotsPerPath() = default;
363  std::string const&,
364  ProcessCallGraph const&,
366  PlotRanges const& ranges,
367  unsigned int lumisections,
368  bool byls);
369  void fill(ProcessCallGraph::PathType const&,
370  ResourcesPerJob const&,
371  ResourcesPerPath const&,
372  unsigned int lumisection);
373 
374  private:
375  // resources spent in all the modules in the path, including their dependencies
377 
378  // Note:
379  // a TH1F has 7 significant digits, while a 24-hour long run could process
380  // order of 10 billion events; a 64-bit long integer would work and might
381  // be better suited than a double, but there is no "TH1L" in ROOT.
382 
383  // how many times each module and their dependencies has run
385  // resources spent in each module and their dependencies
390  };
391 
393  public:
396  ProcessCallGraph const&,
398  PlotRanges const& event_ranges,
399  PlotRanges const& path_ranges,
400  unsigned int lumisections,
401  bool bypath,
402  bool byls);
403  void fill(ProcessCallGraph::ProcessType const&, ResourcesPerJob const&, ResourcesPerProcess const&, unsigned int ls);
404 
405  private:
406  // resources spent in all the modules of the (sub)process
408  // resources spent in each path and endpath
409  std::vector<PlotsPerPath> paths_;
410  std::vector<PlotsPerPath> endpaths_;
411  };
412 
413  class PlotsPerJob {
414  public:
415  PlotsPerJob(ProcessCallGraph const& job, std::vector<GroupOfModules> const& groups);
417  ProcessCallGraph const&,
418  std::vector<GroupOfModules> const&,
419  PlotRanges const& event_ranges,
420  PlotRanges const& path_ranges,
421  PlotRanges const& module_ranges,
422  unsigned int lumisections,
423  bool bymodule,
424  bool bypath,
425  bool byls,
426  bool transitions);
427  void fill(ProcessCallGraph const&, ResourcesPerJob const&, unsigned int ls);
428  void fill_run(AtomicResources const&);
429  void fill_lumi(AtomicResources const&, unsigned int lumisection);
430 
431  private:
432  // resources spent in all the modules of the job
437  // resources spent in the modules' lumi and run transitions
440  // resources spent in the highlighted modules
441  std::vector<PlotsPerElement> highlight_;
442  // resources spent in each module
443  std::vector<PlotsPerElement> modules_;
444  // resources spent in each (sub)process
445  std::vector<PlotsPerProcess> processes_;
446  };
447 
448  // keep track of the dependencies among modules
450 
451  // per-stream information
452  std::vector<ResourcesPerJob> streams_;
453 
454  // concurrent histograms and profiles
455  std::unique_ptr<PlotsPerJob> plots_;
456 
457  // per-lumi and per-run information
458  std::vector<AtomicResources> lumi_transition_; // resources spent in the modules' global and stream lumi transitions
459  std::vector<AtomicResources> run_transition_; // resources spent in the modules' global and stream run transitions
460 
461  // summary data
462  ResourcesPerJob job_summary_; // whole event time accounting per-job
463  std::vector<ResourcesPerJob> run_summary_; // whole event time accounting per-run
464  std::mutex summary_mutex_; // synchronise access to the summary objects across different threads
465 
466  //
467  struct ThreadGuard {
468  struct specific_t {
470  ~specific_t() = default;
471 
474  std::atomic<bool> live_;
475  };
476 
477  ThreadGuard();
478  ~ThreadGuard() = default;
479 
480  static void retire_thread(void* t);
481  static std::shared_ptr<specific_t>* ptr(void* p);
482 
484  Measurement& thread();
485  void finalize();
486 
487  tbb::concurrent_vector<std::shared_ptr<specific_t>> thread_resources_;
488  pthread_key_t key_;
489  };
490 
491  //
493 
494  // atomic variables to keep track of the completion of each step, process by process
495  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_event_check_;
496  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_global_lumi_check_;
497  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_global_run_check_;
498 
499  // retrieve the current thread's per-thread quantities
500  Measurement& thread();
501 
502  // job configuration
503  unsigned int concurrent_lumis_;
504  unsigned int concurrent_runs_;
505  unsigned int concurrent_streams_;
506  unsigned int concurrent_threads_;
507 
508  // logging configuration
509  const bool print_event_summary_; // print the time spent in each process, path and module after every event
510  const bool print_run_summary_; // print the time spent in each process, path and module for each run
511  const bool print_job_summary_; // print the time spent in each process, path and module for the whole job
512 
513  // JSON configuration
514  //const bool write_json_per_event_;
515  //const bool write_json_per_ls_;
516  //const bool write_json_per_run_;
519 
520  // dqm configuration
521  bool enable_dqm_; // non const, depends on the availability of the DQMStore
523  const bool enable_dqm_bypath_;
524  const bool enable_dqm_byls_;
527 
531  const unsigned int dqm_lumisections_range_;
533 
534  std::vector<edm::ParameterSet> highlight_module_psets_; // non-const, cleared in postBeginJob()
535  std::vector<GroupOfModules> highlight_modules_; // non-const, filled in postBeginJob()
536 
537  // log unsupported signals
538  mutable tbb::concurrent_unordered_set<std::string> unsupported_signals_; // keep track of unsupported signals received
539 
540  // print the resource usage summary for en event, a run, or the while job
541  template <typename T>
542  void printHeader(T& out, std::string const& label) const;
543 
544  template <typename T>
545  void printEventHeader(T& out, std::string const& label) const;
546 
547  template <typename T>
548  void printEventLine(T& out, Resources const& data, std::string const& label) const;
549 
550  template <typename T>
551  void printEventLine(T& out, AtomicResources const& data, std::string const& label) const;
552 
553  template <typename T>
554  void printEvent(T& out, ResourcesPerJob const&) const;
555 
556  template <typename T>
557  void printSummaryHeader(T& out, std::string const& label, bool detailed) const;
558 
559  template <typename T>
560  void printPathSummaryHeader(T& out, std::string const& label) const;
561 
562  template <typename T>
563  void printSummaryLine(T& out, Resources const& data, uint64_t events, std::string const& label) const;
564 
565  template <typename T>
566  void printSummaryLine(T& out, Resources const& data, uint64_t events, uint64_t active, std::string const& label) const;
567 
568  template <typename T>
569  void printSummaryLine(T& out, AtomicResources const& data, uint64_t events, std::string const& label) const;
570 
571  template <typename T>
572  void printSummaryLine(
573  T& out, AtomicResources const& data, uint64_t events, uint64_t active, std::string const& label) const;
574 
575  template <typename T>
577  T& out, Resources const& data, Resources const& total, uint64_t events, std::string const& label) const;
578 
579  template <typename T>
580  void printSummary(T& out, ResourcesPerJob const& data, std::string const& label) const;
581 
582  template <typename T>
583  void printTransition(T& out, AtomicResources const& data, std::string const& label) const;
584 
585  template <typename T>
586  json encodeToJSON(std::string const& type, std::string const& label, unsigned int events, T const& data) const;
587 
589 
590  void writeSummaryJSON(ResourcesPerJob const& data, std::string const& filename) const;
591 
592  // check if this is the first process being signalled
595 
596  // check if this is the lest process being signalled
597  bool isLastSubprocess(std::atomic<unsigned int>& check);
598 };
599 
600 #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)
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
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()
nlohmann::json json
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_
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:80
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)