Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-12-30 23:27:57

0001 #include "DataFormats/PortableTestObjects/interface/alpaka/TestDeviceCollection.h"
0002 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0003 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0004 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0005 #include "FWCore/Utilities/interface/InputTag.h"
0006 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/global/EDProducer.h"
0007 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/EDPutToken.h"
0008 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESGetToken.h"
0009 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0010 #include "HeterogeneousCore/AlpakaTest/interface/AlpakaESTestRecords.h"
0011 #include "HeterogeneousCore/AlpakaTest/interface/alpaka/AlpakaESTestData.h"
0012 
0013 #include "TestAlgo.h"
0014 
0015 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0016   /**
0017    * This class demonstrates a global EDProducer that
0018    * - consumes a device ESProduct
0019    * - consumes a device EDProduct
0020    * - produces a device EDProduct (that can get transferred to host automatically)
0021    */
0022   class TestAlpakaGlobalProducerE : public global::EDProducer<> {
0023   public:
0024     TestAlpakaGlobalProducerE(edm::ParameterSet const& config)
0025         : EDProducer<>(config),
0026           esToken_(esConsumes(config.getParameter<edm::ESInputTag>("eventSetupSource"))),
0027           getToken_(consumes(config.getParameter<edm::InputTag>("source"))),
0028           getTokenMulti2_(consumes(config.getParameter<edm::InputTag>("source"))),
0029           getTokenMulti3_(consumes(config.getParameter<edm::InputTag>("source"))),
0030           putToken_{produces()},
0031           putTokenMulti2_{produces()},
0032           putTokenMulti3_{produces()} {}
0033 
0034     void produce(edm::StreamID, device::Event& iEvent, device::EventSetup const& iSetup) const override {
0035       auto const& esData = iSetup.getData(esToken_);
0036       auto const& input = iEvent.get(getToken_);
0037       auto const& inputMulti2 = iEvent.get(getTokenMulti2_);
0038       auto const& inputMulti3 = iEvent.get(getTokenMulti3_);
0039 
0040       // run the algorithm, potentially asynchronously
0041       auto deviceProduct = algo_.update(iEvent.queue(), input, esData);
0042       auto deviceProductMulti2 = algo_.updateMulti2(iEvent.queue(), inputMulti2, esData);
0043       auto deviceProductMulti3 = algo_.updateMulti3(iEvent.queue(), inputMulti3, esData);
0044 
0045       iEvent.emplace(putToken_, std::move(deviceProduct));
0046       iEvent.emplace(putTokenMulti2_, std::move(deviceProductMulti2));
0047       iEvent.emplace(putTokenMulti3_, std::move(deviceProductMulti3));
0048     }
0049 
0050     static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0051       edm::ParameterSetDescription desc;
0052       desc.add("eventSetupSource", edm::ESInputTag{});
0053       desc.add("source", edm::InputTag{});
0054 
0055       descriptions.addWithDefaultLabel(desc);
0056     }
0057 
0058   private:
0059     const device::ESGetToken<AlpakaESTestDataEDevice, AlpakaESTestRecordC> esToken_;
0060     const device::EDGetToken<portabletest::TestDeviceCollection> getToken_;
0061     const device::EDGetToken<portabletest::TestDeviceMultiCollection2> getTokenMulti2_;
0062     const device::EDGetToken<portabletest::TestDeviceMultiCollection3> getTokenMulti3_;
0063     const device::EDPutToken<portabletest::TestDeviceCollection> putToken_;
0064     const device::EDPutToken<portabletest::TestDeviceMultiCollection2> putTokenMulti2_;
0065     const device::EDPutToken<portabletest::TestDeviceMultiCollection3> putTokenMulti3_;
0066 
0067     // implementation of the algorithm
0068     TestAlgo algo_;
0069   };
0070 
0071 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0072 
0073 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0074 DEFINE_FWK_ALPAKA_MODULE(TestAlpakaGlobalProducerE);