Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-02-05 03:15:03

0001 #ifndef HeterogeneousCore_AlpakaCore_interface_alpaka_stream_SynchronizingEDProducer_h
0002 #define HeterogeneousCore_AlpakaCore_interface_alpaka_stream_SynchronizingEDProducer_h
0003 
0004 #include "FWCore/Concurrency/interface/WaitingTaskWithArenaHolder.h"
0005 #include "FWCore/Framework/interface/stream/EDProducer.h"
0006 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDMetadataAcquireSentry.h"
0007 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDMetadataSentry.h"
0008 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/Event.h"
0009 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EventSetup.h"
0010 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ProducerBase.h"
0011 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0012 
0013 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0014   namespace stream {
0015     template <typename... Args>
0016     class SynchronizingEDProducer : public ProducerBase<edm::stream::EDProducer, edm::ExternalWork, Args...> {
0017       static_assert(
0018           not edm::CheckAbility<edm::module::Abilities::kExternalWork, Args...>::kHasIt,
0019           "ExternalWork ability is redundant with ALPAKA_ACCELERATOR_NAMESPACE::stream::SynchronizingEDProducer."
0020           "Please remove it.");
0021       using Base = ProducerBase<edm::stream::EDProducer, edm::ExternalWork, Args...>;
0022 
0023     protected:
0024       SynchronizingEDProducer(edm::ParameterSet const iConfig) : Base(iConfig) {}
0025 
0026     public:
0027       void acquire(edm::Event const& iEvent,
0028                    edm::EventSetup const& iSetup,
0029                    edm::WaitingTaskWithArenaHolder holder) final {
0030         detail::EDMetadataAcquireSentry sentry(iEvent.streamID(), std::move(holder), this->synchronize());
0031         device::Event const ev(iEvent, sentry.metadata());
0032         device::EventSetup const es(iSetup, ev.device());
0033         acquire(ev, es);
0034         metadata_ = sentry.finish();
0035       }
0036 
0037       void produce(edm::Event& iEvent, edm::EventSetup const& iSetup) final {
0038         detail::EDMetadataSentry sentry(std::move(metadata_), this->synchronize());
0039         device::Event ev(iEvent, sentry.metadata());
0040         device::EventSetup const es(iSetup, ev.device());
0041         produce(ev, es);
0042         this->putBackend(iEvent);
0043         sentry.finish(ev.wasQueueUsed());
0044       }
0045 
0046       virtual void acquire(device::Event const& iEvent, device::EventSetup const& iSetup) = 0;
0047 
0048       virtual void produce(device::Event& iEvent, device::EventSetup const& iSetup) = 0;
0049 
0050     private:
0051       std::shared_ptr<EDMetadata> metadata_;
0052     };
0053   }  // namespace stream
0054 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0055 
0056 #endif