CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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
47 
48 /*
49 procesing time is divided into
50  - source
51  - event processing, sum of the time spent in all the modules
52 */
53 
54 class FastTimerService : public tbb::task_scheduler_observer {
55 public:
57  ~FastTimerService() override = default;
58 
59 private:
60  void ignoredSignal(const std::string& signal) const;
61  void unsupportedSignal(const std::string& signal) const;
62 
63  // these signal pairs are not guaranteed to happen in the same thread
64 
66 
68  void postBeginJob();
69 
70  void postEndJob();
71 
74 
77 
80 
83 
86 
89 
92 
95 
96  void preEvent(edm::StreamContext const&);
97  void postEvent(edm::StreamContext const&);
98 
101 
104 
105  // these signal pairs are guaranteed to be called within the same thread
106 
107  //void preOpenFile(std::string const&, bool);
108  //void postOpenFile(std::string const&, bool);
109 
110  //void preCloseFile(std::string const&, bool);
111  //void postCloseFile(std::string const&, bool);
112 
114  //void postSourceConstruction(edm::ModuleDescription const&);
115 
118 
121 
124 
125  //void preModuleConstruction(edm::ModuleDescription const&);
126  //void postModuleConstruction(edm::ModuleDescription const&);
127 
128  //void preModuleBeginJob(edm::ModuleDescription const&);
129  //void postModuleBeginJob(edm::ModuleDescription const&);
130 
131  //void preModuleEndJob(edm::ModuleDescription const&);
132  //void postModuleEndJob(edm::ModuleDescription const&);
133 
134  //void preModuleBeginStream(edm::StreamContext const&, edm::ModuleCallingContext const&);
135  //void postModuleBeginStream(edm::StreamContext const&, edm::ModuleCallingContext const&);
136 
137  //void preModuleEndStream(edm::StreamContext const&, edm::ModuleCallingContext const&);
138  //void postModuleEndStream(edm::StreamContext const&, edm::ModuleCallingContext const&);
139 
142 
145 
148 
151 
154 
157 
160 
163 
166 
169 
172 
175 
176  // inherited from TBB task_scheduler_observer
177  void on_scheduler_entry(bool worker) final;
178  void on_scheduler_exit(bool worker) final;
179 
180 public:
181  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
182 
183 private:
184  // forward declarations
185  struct Resources;
186  struct AtomicResources;
187 
188  // per-thread measurements
189  struct Measurement {
190  public:
191  Measurement() noexcept;
192  // take per-thread measurements
193  void measure() noexcept;
194  // take per-thread measurements, compute the delta with respect to the previous measurement, and store them in the argument
195  void measure_and_store(Resources& store) noexcept;
196  // take per-thread measurements, compute the delta with respect to the previous measurement, and add them to the argument
197  void measure_and_accumulate(Resources& store) noexcept;
198  void measure_and_accumulate(AtomicResources& store) noexcept;
199 
200  public:
201 #ifdef DEBUG_THREAD_CONCURRENCY
203 #endif // DEBUG_THREAD_CONCURRENCY
204  boost::chrono::thread_clock::time_point time_thread;
205  boost::chrono::high_resolution_clock::time_point time_real;
208  };
209 
210  // highlight a group of modules
211  struct GroupOfModules {
212  public:
214  std::vector<unsigned int> modules;
215  };
216 
217  // resources being monitored by the service
218  struct Resources {
219  public:
220  Resources();
221  void reset();
222 
223  Resources& operator+=(Resources const& other);
224  Resources& operator+=(struct AtomicResources const& other);
225  Resources operator+(Resources const& other) const;
226  Resources operator+(struct AtomicResources const& other) const;
227 
228  public:
233  };
234 
235  // atomic version of Resources
236  // Note: the structure as a whole is *not* atomic, only the individual fields are
238  public:
239  AtomicResources();
240  AtomicResources(AtomicResources const& other);
241  void reset();
242 
245  AtomicResources& operator+=(Resources const& other);
246  AtomicResources operator+(AtomicResources const& other) const;
247  Resources operator+(Resources const& other) const;
248 
249  public:
250  std::atomic<boost::chrono::nanoseconds::rep> time_thread;
251  std::atomic<boost::chrono::nanoseconds::rep> time_real;
252  std::atomic<uint64_t> allocated;
253  std::atomic<uint64_t> deallocated;
254  };
255 
256  // resources associated to each module, path, process and job
257 
259  public:
260  ResourcesPerModule() noexcept;
261  void reset() noexcept;
262 
264  ResourcesPerModule operator+(ResourcesPerModule const& other) const;
265 
266  public:
268  unsigned events;
269  bool has_acquire; // whether this module has an acquire() method
270  };
271 
273  public:
274  void reset();
276  ResourcesPerPath operator+(ResourcesPerPath const& other) const;
277 
278  public:
279  Resources active; // resources used by all modules on this path
280  Resources total; // resources used by all modules on this path, and their dependencies
281  unsigned last; // one-past-the last module that ran on this path
282  bool status; // whether the path accepted or rejected the event
283  };
284 
286  public:
288  void reset();
291 
292  public:
294  std::vector<ResourcesPerPath> paths;
295  std::vector<ResourcesPerPath> endpaths;
296  };
297 
299  public:
300  ResourcesPerJob() = default;
301  ResourcesPerJob(ProcessCallGraph const& job, std::vector<GroupOfModules> const& groups);
302  void reset();
304  ResourcesPerJob operator+(ResourcesPerJob const& other) const;
305 
306  public:
309  Resources event; // total time etc. spent between preSourceEvent and postEvent
311  std::vector<Resources> highlight;
312  std::vector<ResourcesPerModule> modules;
313  std::vector<ResourcesPerProcess> processes;
314  unsigned events;
315  };
316 
317  // plot ranges and resolution
318  struct PlotRanges {
319  double time_range;
321  double memory_range;
323  };
324 
325  // plots associated to each module or other element (path, process, etc)
327  public:
328  PlotsPerElement() = default;
330  std::string const& name,
331  std::string const& title,
332  PlotRanges const& ranges,
333  unsigned int lumisections,
334  bool byls);
335  void fill(Resources const&, unsigned int lumisection);
336  void fill(AtomicResources const&, unsigned int lumisection);
337  void fill_fraction(Resources const&, Resources const&, unsigned int lumisection);
338 
339  private:
340  // resources spent in the module
349  };
350 
351  // plots associated to each path or endpath
352  class PlotsPerPath {
353  public:
354  PlotsPerPath() = default;
356  std::string const&,
357  ProcessCallGraph const&,
359  PlotRanges const& ranges,
360  unsigned int lumisections,
361  bool byls);
362  void fill(ProcessCallGraph::PathType const&,
363  ResourcesPerJob const&,
364  ResourcesPerPath const&,
365  unsigned int lumisection);
366 
367  private:
368  // resources spent in all the modules in the path, including their dependencies
370 
371  // Note:
372  // a TH1F has 7 significant digits, while a 24-hour long run could process
373  // order of 10 billion events; a 64-bit long integer would work and might
374  // be better suited than a double, but there is no "TH1L" in ROOT.
375 
376  // how many times each module and their dependencies has run
378  // resources spent in each module and their dependencies
383  };
384 
386  public:
389  ProcessCallGraph const&,
391  PlotRanges const& event_ranges,
392  PlotRanges const& path_ranges,
393  unsigned int lumisections,
394  bool bypath,
395  bool byls);
396  void fill(ProcessCallGraph::ProcessType const&, ResourcesPerJob const&, ResourcesPerProcess const&, unsigned int ls);
397 
398  private:
399  // resources spent in all the modules of the (sub)process
401  // resources spent in each path and endpath
402  std::vector<PlotsPerPath> paths_;
403  std::vector<PlotsPerPath> endpaths_;
404  };
405 
406  class PlotsPerJob {
407  public:
408  PlotsPerJob(ProcessCallGraph const& job, std::vector<GroupOfModules> const& groups);
410  ProcessCallGraph const&,
411  std::vector<GroupOfModules> const&,
412  PlotRanges const& event_ranges,
413  PlotRanges const& path_ranges,
414  PlotRanges const& module_ranges,
415  unsigned int lumisections,
416  bool bymodule,
417  bool bypath,
418  bool byls,
419  bool transitions);
420  void fill(ProcessCallGraph const&, ResourcesPerJob const&, unsigned int ls);
421  void fill_run(AtomicResources const&);
422  void fill_lumi(AtomicResources const&, unsigned int lumisection);
423 
424  private:
425  // resources spent in all the modules of the job
429  // resources spent in the modules' lumi and run transitions
432  // resources spent in the highlighted modules
433  std::vector<PlotsPerElement> highlight_;
434  // resources spent in each module
435  std::vector<PlotsPerElement> modules_;
436  // resources spent in each (sub)process
437  std::vector<PlotsPerProcess> processes_;
438  };
439 
440  // keep track of the dependencies among modules
442 
443  // per-stream information
444  std::vector<ResourcesPerJob> streams_;
445 
446  // concurrent histograms and profiles
447  std::unique_ptr<PlotsPerJob> plots_;
448 
449  // per-lumi and per-run information
450  std::vector<AtomicResources> lumi_transition_; // resources spent in the modules' global and stream lumi transitions
451  std::vector<AtomicResources> run_transition_; // resources spent in the modules' global and stream run transitions
452  AtomicResources overhead_; // resources spent outside of the modules' transitions
453 
454  // summary data
455  ResourcesPerJob job_summary_; // whole event time accounting per-job
456  std::vector<ResourcesPerJob> run_summary_; // whole event time accounting per-run
457  std::mutex summary_mutex_; // synchronise access to the summary objects across different threads
458 
459  //
460  struct ThreadGuard {
461  struct specific_t {
463  ~specific_t() = default;
464 
467  std::atomic<bool> live_;
468  };
469 
470  ThreadGuard();
471  ~ThreadGuard() = default;
472 
473  static void retire_thread(void* t);
474  static std::shared_ptr<specific_t>* ptr(void* p);
475 
477  Measurement& thread();
478  void finalize();
479 
480  tbb::concurrent_vector<std::shared_ptr<specific_t>> thread_resources_;
481  pthread_key_t key_;
482  };
483 
484  //
486 
487  // atomic variables to keep track of the completion of each step, process by process
488  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_event_check_;
489  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_global_lumi_check_;
490  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_global_run_check_;
491 
492  // retrieve the current thread's per-thread quantities
493  Measurement& thread();
494 
495  // job configuration
496  unsigned int concurrent_lumis_;
497  unsigned int concurrent_runs_;
498  unsigned int concurrent_streams_;
499  unsigned int concurrent_threads_;
500 
501  // logging configuration
502  const bool print_event_summary_; // print the time spent in each process, path and module after every event
503  const bool print_run_summary_; // print the time spent in each process, path and module for each run
504  const bool print_job_summary_; // print the time spent in each process, path and module for the whole job
505 
506  // JSON configuration
507  //const bool write_json_per_event_;
508  //const bool write_json_per_ls_;
509  //const bool write_json_per_run_;
512 
513  // dqm configuration
514  bool enable_dqm_; // non const, depends on the availability of the DQMStore
516  const bool enable_dqm_bypath_;
517  const bool enable_dqm_byls_;
520 
524  const unsigned int dqm_lumisections_range_;
526 
527  std::vector<edm::ParameterSet> highlight_module_psets_; // non-const, cleared in postBeginJob()
528  std::vector<GroupOfModules> highlight_modules_; // non-const, filled in postBeginJob()
529 
530  // log unsupported signals
531  mutable tbb::concurrent_unordered_set<std::string> unsupported_signals_; // keep track of unsupported signals received
532 
533  // print the resource usage summary for en event, a run, or the while job
534  template <typename T>
535  void printHeader(T& out, std::string const& label) const;
536 
537  template <typename T>
538  void printEventHeader(T& out, std::string const& label) const;
539 
540  template <typename T>
541  void printEventLine(T& out, Resources const& data, std::string const& label) const;
542 
543  template <typename T>
544  void printEventLine(T& out, AtomicResources const& data, std::string const& label) const;
545 
546  template <typename T>
547  void printEvent(T& out, ResourcesPerJob const&) const;
548 
549  template <typename T>
550  void printSummaryHeader(T& out, std::string const& label, bool detailed) const;
551 
552  template <typename T>
553  void printPathSummaryHeader(T& out, std::string const& label) const;
554 
555  template <typename T>
556  void printSummaryLine(T& out, Resources const& data, uint64_t events, std::string const& label) const;
557 
558  template <typename T>
559  void printSummaryLine(T& out, Resources const& data, uint64_t events, uint64_t active, std::string const& label) const;
560 
561  template <typename T>
562  void printSummaryLine(T& out, AtomicResources const& data, uint64_t events, std::string const& label) const;
563 
564  template <typename T>
565  void printSummaryLine(
566  T& out, AtomicResources const& data, uint64_t events, uint64_t active, std::string const& label) const;
567 
568  template <typename T>
570  T& out, Resources const& data, Resources const& total, uint64_t events, std::string const& label) const;
571 
572  template <typename T>
573  void printSummary(T& out, ResourcesPerJob const& data, std::string const& label) const;
574 
575  template <typename T>
576  void printTransition(T& out, AtomicResources const& data, std::string const& label) const;
577 
578  template <typename T>
579  json encodeToJSON(std::string const& type, std::string const& label, unsigned int events, T const& data) const;
580 
582 
583  void writeSummaryJSON(ResourcesPerJob const& data, std::string const& filename) const;
584 
585  // check if this is the first process being signalled
588 
589  // check if this is the lest process being signalled
590  bool isLastSubprocess(std::atomic<unsigned int>& check);
591 };
592 
593 #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)
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
dqm::reco::MonitorElement * deallocated_byls_
AtomicResources operator+(AtomicResources const &other) const
unsigned int concurrent_threads_
void postEventReadFromSource(edm::StreamContext const &, edm::ModuleCallingContext const &)
uint16_t *__restrict__ id
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
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_
const std::string json_filename_
bool isFirstSubprocess(edm::StreamContext const &)
def ls
Definition: eostools.py:349
const bool enable_dqm_bynproc_
unsigned int concurrent_runs_
void writeSummaryJSON(ResourcesPerJob const &data, std::string const &filename) const
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
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)
Measurement & thread()
void postStreamBeginLumi(edm::StreamContext const &)
dqm::reco::MonitorElement * deallocated_
dqm::reco::MonitorElement * time_real_
const PlotRanges dqm_path_ranges_
ResourcesPerProcess operator+(ResourcesPerProcess const &other) const
boost::chrono::thread_clock::time_point time_thread
ResourcesPerJob operator+(ResourcesPerJob const &other) const
std::vector< ResourcesPerModule > modules
char const * label
void printEvent(T &out, ResourcesPerJob const &) const
void printHeader(T &out, std::string const &label) const
void postModuleStreamEndLumi(edm::StreamContext const &, edm::ModuleCallingContext const &)
std::mutex summary_mutex_
void printPathSummaryHeader(T &out, std::string const &label) const
ResourcesPerJob & operator+=(ResourcesPerJob const &other)
void printSummaryHeader(T &out, std::string const &label, bool detailed) const
void fill(ProcessCallGraph::ProcessType const &, ResourcesPerJob const &, ResourcesPerProcess const &, unsigned int ls)
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
void printEventHeader(T &out, std::string const &label) const
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)
ResourcesPerModule operator+(ResourcesPerModule const &other) const
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_
unsigned int concurrent_lumis_
std::string dqm_path_
bool register_thread(FastTimerService::AtomicResources &r)
dqm::reco::MonitorElement * module_time_real_total_
void printSummaryLine(T &out, Resources const &data, uint64_t events, std::string const &label) const
const bool enable_dqm_transitions_
void printEventLine(T &out, Resources const &data, std::string const &label) const
std::atomic< boost::chrono::nanoseconds::rep > time_thread
Resources operator+(Resources const &other) const
void measure_and_store(Resources &store) noexcept
std::vector< Resources > highlight
const bool enable_dqm_bymodule_
void printPathSummaryLine(T &out, Resources const &data, Resources const &total, uint64_t events, std::string const &label) const
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 &)
void printTransition(T &out, AtomicResources const &data, std::string const &label) const
std::vector< AtomicResources > run_transition_
void preModuleStreamEndRun(edm::StreamContext const &, edm::ModuleCallingContext const &)
void postModuleStreamEndRun(edm::StreamContext const &, edm::ModuleCallingContext 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 preStreamBeginLumi(edm::StreamContext const &)
ResourcesPerProcess(ProcessCallGraph::ProcessType const &process)
void ignoredSignal(const std::string &signal) const
void postSourceEvent(edm::StreamID)
dqm::reco::MonitorElement * allocated_
void preModuleStreamBeginLumi(edm::StreamContext const &, edm::ModuleCallingContext 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 preStreamEndLumi(edm::StreamContext const &)
void measure_and_accumulate(Resources &store) noexcept
ResourcesPerModule & operator+=(ResourcesPerModule const &other)
tuple filename
Definition: lut2db_cfg.py:20
void postModuleEventPrefetching(edm::StreamContext const &, edm::ModuleCallingContext const &)
void preModuleGlobalEndLumi(edm::GlobalContext const &, edm::ModuleCallingContext const &)
std::unique_ptr< PlotsPerJob > plots_
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 postSourceLumi(edm::LuminosityBlockIndex)
void postModuleGlobalBeginRun(edm::GlobalContext const &, edm::ModuleCallingContext const &)
std::vector< ResourcesPerProcess > processes
AtomicResources & operator=(AtomicResources const &other)
tuple process
Definition: LaserDQM_cfg.py:3
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
ResourcesPerPath operator+(ResourcesPerPath const &other) const
void preModuleGlobalBeginRun(edm::GlobalContext const &, edm::ModuleCallingContext const &)
std::vector< AtomicResources > lumi_transition_
int events
unsigned int concurrent_streams_
bool isLastSubprocess(std::atomic< unsigned int > &check)
void preallocate(edm::service::SystemBounds const &)
tuple module
Definition: callgraph.py:69
void fill(ProcessCallGraph const &, ResourcesPerJob const &, unsigned int ls)
json encodeToJSON(std::string const &type, std::string const &label, unsigned int events, T const &data) const
void fill(ProcessCallGraph::PathType const &, ResourcesPerJob const &, ResourcesPerPath const &, unsigned int lumisection)