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 
187 private:
188  // forward declarations
189  struct Resources;
190  struct AtomicResources;
191 
192  // per-thread measurements
193  struct Measurement {
194  public:
195  Measurement() noexcept;
196  // take per-thread measurements
197  void measure() noexcept;
198  // take per-thread measurements, compute the delta with respect to the previous measurement, and store them in the argument
199  void measure_and_store(Resources& store) noexcept;
200  // take per-thread measurements, compute the delta with respect to the previous measurement, and add them to the argument
201  void measure_and_accumulate(Resources& store) noexcept;
202  void measure_and_accumulate(AtomicResources& store) noexcept;
203 
204  public:
205 #ifdef DEBUG_THREAD_CONCURRENCY
207 #endif // DEBUG_THREAD_CONCURRENCY
208  boost::chrono::thread_clock::time_point time_thread;
209  boost::chrono::high_resolution_clock::time_point time_real;
212  };
213 
214  // highlight a group of modules
215  struct GroupOfModules {
216  public:
218  std::vector<unsigned int> modules;
219  };
220 
221  // resources being monitored by the service
222  struct Resources {
223  public:
224  Resources();
225  void reset();
226 
228  Resources& operator+=(struct AtomicResources const& other);
229  Resources operator+(Resources const& other) const;
230  Resources operator+(struct AtomicResources const& other) const;
231 
232  public:
237  };
238 
239  // atomic version of Resources
240  // Note: the structure as a whole is *not* atomic, only the individual fields are
242  public:
243  AtomicResources();
245  void reset();
246 
251  Resources operator+(Resources const& other) const;
252 
253  public:
254  std::atomic<boost::chrono::nanoseconds::rep> time_thread;
255  std::atomic<boost::chrono::nanoseconds::rep> time_real;
256  std::atomic<uint64_t> allocated;
257  std::atomic<uint64_t> deallocated;
258  };
259 
260  // resources associated to each module, path, process and job
261 
263  public:
264  ResourcesPerModule() noexcept;
265  void reset() noexcept;
266 
269 
270  public:
272  unsigned events;
273  bool has_acquire; // whether this module has an acquire() method
274  };
275 
277  public:
278  void reset();
281 
282  public:
283  Resources active; // resources used by all modules on this path
284  Resources total; // resources used by all modules on this path, and their dependencies
285  unsigned last; // one-past-the last module that ran on this path
286  bool status; // whether the path accepted or rejected the event
287  };
288 
290  public:
292  void reset();
295 
296  public:
298  std::vector<ResourcesPerPath> paths;
299  std::vector<ResourcesPerPath> endpaths;
300  };
301 
303  public:
304  ResourcesPerJob() = default;
305  ResourcesPerJob(ProcessCallGraph const& job, std::vector<GroupOfModules> const& groups);
306  void reset();
309 
310  public:
314  Resources event; // total time etc. spent between preSourceEvent and postEvent
316  std::vector<Resources> highlight;
317  std::vector<ResourcesPerModule> modules;
318  std::vector<ResourcesPerProcess> processes;
319  unsigned events;
320  };
321 
322  // plot ranges and resolution
323  struct PlotRanges {
324  double time_range;
326  double memory_range;
328  };
329 
330  // plots associated to each module or other element (path, process, etc)
332  public:
333  PlotsPerElement() = default;
335  std::string const& name,
336  std::string const& title,
337  PlotRanges const& ranges,
338  unsigned int lumisections,
339  bool byls);
340  void fill(Resources const&, unsigned int lumisection);
341  void fill(AtomicResources const&, unsigned int lumisection);
342  void fill_fraction(Resources const&, Resources const&, unsigned int lumisection);
343 
344  private:
345  // resources spent in the module
354  };
355 
356  // plots associated to each path or endpath
357  class PlotsPerPath {
358  public:
359  PlotsPerPath() = default;
361  std::string const&,
362  ProcessCallGraph const&,
364  PlotRanges const& ranges,
365  unsigned int lumisections,
366  bool byls);
367  void fill(ProcessCallGraph::PathType const&,
368  ResourcesPerJob const&,
369  ResourcesPerPath const&,
370  unsigned int lumisection);
371 
372  private:
373  // resources spent in all the modules in the path, including their dependencies
375 
376  // Note:
377  // a TH1F has 7 significant digits, while a 24-hour long run could process
378  // order of 10 billion events; a 64-bit long integer would work and might
379  // be better suited than a double, but there is no "TH1L" in ROOT.
380 
381  // how many times each module and their dependencies has run
383  // resources spent in each module and their dependencies
388  };
389 
391  public:
394  ProcessCallGraph const&,
396  PlotRanges const& event_ranges,
397  PlotRanges const& path_ranges,
398  unsigned int lumisections,
399  bool bypath,
400  bool byls);
401  void fill(ProcessCallGraph::ProcessType const&, ResourcesPerJob const&, ResourcesPerProcess const&, unsigned int ls);
402 
403  private:
404  // resources spent in all the modules of the (sub)process
406  // resources spent in each path and endpath
407  std::vector<PlotsPerPath> paths_;
408  std::vector<PlotsPerPath> endpaths_;
409  };
410 
411  class PlotsPerJob {
412  public:
413  PlotsPerJob(ProcessCallGraph const& job, std::vector<GroupOfModules> const& groups);
415  ProcessCallGraph const&,
416  std::vector<GroupOfModules> const&,
417  PlotRanges const& event_ranges,
418  PlotRanges const& path_ranges,
419  PlotRanges const& module_ranges,
420  unsigned int lumisections,
421  bool bymodule,
422  bool bypath,
423  bool byls,
424  bool transitions);
425  void fill(ProcessCallGraph const&, ResourcesPerJob const&, unsigned int ls);
426  void fill_run(AtomicResources const&);
427  void fill_lumi(AtomicResources const&, unsigned int lumisection);
428 
429  private:
430  // resources spent in all the modules of the job
434  // resources spent in the modules' lumi and run transitions
437  // resources spent in the highlighted modules
438  std::vector<PlotsPerElement> highlight_;
439  // resources spent in each module
440  std::vector<PlotsPerElement> modules_;
441  // resources spent in each (sub)process
442  std::vector<PlotsPerProcess> processes_;
443  };
444 
445  // keep track of the dependencies among modules
447 
448  // per-stream information
449  std::vector<ResourcesPerJob> streams_;
450 
451  // concurrent histograms and profiles
452  std::unique_ptr<PlotsPerJob> plots_;
453 
454  // per-lumi and per-run information
455  std::vector<AtomicResources> lumi_transition_; // resources spent in the modules' global and stream lumi transitions
456  std::vector<AtomicResources> run_transition_; // resources spent in the modules' global and stream run transitions
457  AtomicResources overhead_; // resources spent outside of the modules' transitions
458 
459  // summary data
460  ResourcesPerJob job_summary_; // whole event time accounting per-job
461  std::vector<ResourcesPerJob> run_summary_; // whole event time accounting per-run
462  std::mutex summary_mutex_; // synchronise access to the summary objects across different threads
463 
464  //
465  struct ThreadGuard {
466  struct specific_t {
468  ~specific_t() = default;
469 
472  std::atomic<bool> live_;
473  };
474 
475  ThreadGuard();
476  ~ThreadGuard() = default;
477 
478  static void retire_thread(void* t);
479  static std::shared_ptr<specific_t>* ptr(void* p);
480 
482  Measurement& thread();
483  void finalize();
484 
485  tbb::concurrent_vector<std::shared_ptr<specific_t>> thread_resources_;
486  pthread_key_t key_;
487  };
488 
489  //
491 
492  // atomic variables to keep track of the completion of each step, process by process
493  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_event_check_;
494  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_global_lumi_check_;
495  std::unique_ptr<std::atomic<unsigned int>[]> subprocess_global_run_check_;
496 
497  // retrieve the current thread's per-thread quantities
498  Measurement& thread();
499 
500  // job configuration
501  unsigned int concurrent_lumis_;
502  unsigned int concurrent_runs_;
503  unsigned int concurrent_streams_;
504  unsigned int concurrent_threads_;
505 
506  // logging configuration
507  const bool print_event_summary_; // print the time spent in each process, path and module after every event
508  const bool print_run_summary_; // print the time spent in each process, path and module for each run
509  const bool print_job_summary_; // print the time spent in each process, path and module for the whole job
510 
511  // JSON configuration
512  //const bool write_json_per_event_;
513  //const bool write_json_per_ls_;
514  //const bool write_json_per_run_;
517 
518  // dqm configuration
519  bool enable_dqm_; // non const, depends on the availability of the DQMStore
521  const bool enable_dqm_bypath_;
522  const bool enable_dqm_byls_;
525 
529  const unsigned int dqm_lumisections_range_;
531 
532  std::vector<edm::ParameterSet> highlight_module_psets_; // non-const, cleared in postBeginJob()
533  std::vector<GroupOfModules> highlight_modules_; // non-const, filled in postBeginJob()
534 
535  // log unsupported signals
536  mutable tbb::concurrent_unordered_set<std::string> unsupported_signals_; // keep track of unsupported signals received
537 
538  // print the resource usage summary for en event, a run, or the while job
539  template <typename T>
540  void printHeader(T& out, std::string const& label) const;
541 
542  template <typename T>
543  void printEventHeader(T& out, std::string const& label) const;
544 
545  template <typename T>
546  void printEventLine(T& out, Resources const& data, std::string const& label) const;
547 
548  template <typename T>
549  void printEventLine(T& out, AtomicResources const& data, std::string const& label) const;
550 
551  template <typename T>
552  void printEvent(T& out, ResourcesPerJob const&) const;
553 
554  template <typename T>
555  void printSummaryHeader(T& out, std::string const& label, bool detailed) const;
556 
557  template <typename T>
558  void printPathSummaryHeader(T& out, std::string const& label) const;
559 
560  template <typename T>
561  void printSummaryLine(T& out, Resources const& data, uint64_t events, std::string const& label) const;
562 
563  template <typename T>
564  void printSummaryLine(T& out, Resources const& data, uint64_t events, uint64_t active, std::string const& label) const;
565 
566  template <typename T>
567  void printSummaryLine(T& out, AtomicResources const& data, uint64_t events, std::string const& label) const;
568 
569  template <typename T>
570  void printSummaryLine(
571  T& out, AtomicResources const& data, uint64_t events, uint64_t active, std::string const& label) const;
572 
573  template <typename T>
575  T& out, Resources const& data, Resources const& total, uint64_t events, std::string const& label) const;
576 
577  template <typename T>
578  void printSummary(T& out, ResourcesPerJob const& data, std::string const& label) const;
579 
580  template <typename T>
581  void printTransition(T& out, AtomicResources const& data, std::string const& label) const;
582 
583  template <typename T>
584  json encodeToJSON(std::string const& type, std::string const& label, unsigned int events, T const& data) const;
585 
587 
588  void writeSummaryJSON(ResourcesPerJob const& data, std::string const& filename) const;
589 
590  // check if this is the first process being signalled
593 
594  // check if this is the lest process being signalled
595  bool isLastSubprocess(std::atomic<unsigned int>& check);
596 };
597 
598 #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
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)