diff --git a/src/kokkos/Framework/PluginFactory.cc b/src/kokkos/Framework/PluginFactory.cc index 6e8a33eb6..67b3698bc 100644 --- a/src/kokkos/Framework/PluginFactory.cc +++ b/src/kokkos/Framework/PluginFactory.cc @@ -28,7 +28,7 @@ namespace edm { }; // namespace impl std::unique_ptr create(std::string const& name, ProductRegistry& reg) { - return impl::getGlobalRegistry().get(name)->create(reg); + return impl::getGlobalRegistry().get(name)->create(reg, name); } } // namespace PluginFactory } // namespace edm diff --git a/src/kokkos/Framework/PluginFactory.h b/src/kokkos/Framework/PluginFactory.h index dce323fd6..80d7cd21f 100644 --- a/src/kokkos/Framework/PluginFactory.h +++ b/src/kokkos/Framework/PluginFactory.h @@ -17,14 +17,14 @@ namespace edm { public: virtual ~MakerBase() = default; - virtual std::unique_ptr create(ProductRegistry& reg) const = 0; + virtual std::unique_ptr create(ProductRegistry& reg, const std::string& name) const = 0; }; template class Maker : public MakerBase { public: - virtual std::unique_ptr create(ProductRegistry& reg) const override { - return std::make_unique>(reg); + virtual std::unique_ptr create(ProductRegistry& reg, const std::string& name) const override { + return std::make_unique>(reg, name); }; }; diff --git a/src/kokkos/Framework/Profile.cc b/src/kokkos/Framework/Profile.cc new file mode 100644 index 000000000..2a9602d13 --- /dev/null +++ b/src/kokkos/Framework/Profile.cc @@ -0,0 +1,11 @@ + +#include "Framework/Profile.h" +#include "Framework/Event.h" + +void beginProduce(const std::string& name, const edm::Event& event) {} + +void endProduce(const std::string& name, const edm::Event& event) {} + +void beginAcquire(const std::string& name, const edm::Event& event) {} + +void endAcquire(const std::string& name, const edm::Event& event) {} diff --git a/src/kokkos/Framework/Profile.h b/src/kokkos/Framework/Profile.h new file mode 100644 index 000000000..0c8ed45c6 --- /dev/null +++ b/src/kokkos/Framework/Profile.h @@ -0,0 +1,25 @@ + +#ifndef Profile_h +#define Profile_h + +#include + +// Functions that get called before and after the produce and acquire functions +// get called for each module. +// Intended to be a place to put profiling, instrumentation points, and/or task annotations. +// +// The 'name' parameter is the name of the module being called. + +namespace edm { + class Event; +}; + +void beginProduce(const std::string& name, const edm::Event& event); + +void endProduce(const std::string& name, const edm::Event& event); + +void beginAcquire(const std::string& name, const edm::Event& event); + +void endAcquire(const std::string& name, const edm::Event& event); + +#endif diff --git a/src/kokkos/Framework/Worker.h b/src/kokkos/Framework/Worker.h index 222f4a064..cf6461ca6 100644 --- a/src/kokkos/Framework/Worker.h +++ b/src/kokkos/Framework/Worker.h @@ -9,6 +9,7 @@ #include "Framework/WaitingTaskHolder.h" #include "Framework/WaitingTaskList.h" #include "Framework/WaitingTaskWithArenaHolder.h" +#include "Framework/Profile.h" namespace edm { class Event; @@ -17,7 +18,7 @@ namespace edm { class Worker { public: - Worker() : prefetchRequested_{false} {} + Worker(const std::string& name) : name_(name), prefetchRequested_{false} {} virtual ~Worker() = default; // not thread safe @@ -43,6 +44,7 @@ namespace edm { protected: virtual void doReset() = 0; + std::string name_; private: std::vector itemsToGet_; @@ -52,7 +54,8 @@ namespace edm { template class WorkerT : public Worker { public: - explicit WorkerT(ProductRegistry& reg) : producer_(reg), workStarted_{false} {} + explicit WorkerT(ProductRegistry& reg, const std::string& name) + : Worker(name), producer_(reg), workStarted_{false} {} void doWorkAsync(Event& event, EventSetup const& eventSetup, WaitingTaskHolder task) override { waitingTasksWork_.add(task); @@ -69,7 +72,9 @@ namespace edm { std::exception_ptr exceptionPtr; try { //std::cout << "calling doProduce " << this << std::endl; + beginProduce(name_, event); producer_.doProduce(event, eventSetup); + endProduce(name_, event); } catch (...) { exceptionPtr = std::current_exception(); } @@ -87,7 +92,9 @@ namespace edm { } else { std::exception_ptr exceptionPtr; try { + beginAcquire(name_, event); producer_.doAcquire(event, eventSetup, runProduceHolder); + endAcquire(name_, event); } catch (...) { exceptionPtr = std::current_exception(); } @@ -106,7 +113,9 @@ namespace edm { tbb::task_group group; { WaitingTaskWithArenaHolder runProducerHolder{group, &waitTask}; + beginAcquire(name_, event); producer_.doAcquire(event, eventSetup, runProducerHolder); + endAcquire(name_, event); } do { group.wait(); @@ -115,7 +124,9 @@ namespace edm { std::rethrow_exception(*(waitTask.exceptionPtr())); } } + beginProduce(name_, event); producer_.doProduce(event, eventSetup); + endProduce(name_, event); } void doEndJob() override { producer_.doEndJob(); }