Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:15:42

0001 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0002 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0003 #include "FWCore/Utilities/interface/InputTag.h"
0004 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/stream/SynchronizingEDProducer.h"
0005 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0006 #include "HeterogeneousCore/AlpakaTest/interface/TestHostOnlyHelperClass.h"
0007 
0008 #include "TestHelperClass.h"
0009 
0010 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0011   /**
0012    * This class demonstrates a stream EDProducer that
0013    * - uses a helper class (need to use edm::ConsumesCollector), that
0014    *   - consumes a device EDProduct
0015    *   - consumes a host ESProduct
0016    *   - consumes a device ESProduct
0017    * - uses a non-Alpaka-aware helper class (need to use edm::ConsumesCollector), that
0018    *   - consumes a host EDProduct
0019    *   - consumes a host ESProduct
0020    * - consumes a device ESProduct
0021    * - produces a host EDProduct
0022    * - synchronizes in a non-blocking way with the ExternalWork module
0023    *   ability (via the SynchronizingEDProcucer base class)
0024    */
0025   class TestAlpakaStreamSynchronizingProducer : public stream::SynchronizingEDProducer<> {
0026   public:
0027     TestAlpakaStreamSynchronizingProducer(edm::ParameterSet const& iConfig)
0028         : esTokenDevice_(esConsumes()),
0029           putToken_{produces()},
0030           putTokenMulti2_{produces()},
0031           putTokenMulti3_{produces()},
0032           helper_{iConfig, consumesCollector()},
0033           hostHelper_{iConfig, consumesCollector()},
0034           expectedInt_{iConfig.getParameter<int>("expectedInt")} {}
0035 
0036     void acquire(device::Event const& iEvent, device::EventSetup const& iSetup) override {
0037       [[maybe_unused]] auto const& esData = iSetup.getData(esTokenDevice_);
0038 
0039       int const value = hostHelper_.run(iEvent, iSetup);
0040       if (value != expectedInt_) {
0041         throw cms::Exception("Assert") << "Expected value " << expectedInt_ << ", but got " << value;
0042       }
0043 
0044       helper_.makeAsync(iEvent, iSetup);
0045     }
0046 
0047     void produce(device::Event& iEvent, device::EventSetup const& iSetup) override {
0048       iEvent.emplace(putToken_, helper_.moveFrom());
0049       iEvent.emplace(putTokenMulti2_, helper_.moveFromMulti2());
0050       iEvent.emplace(putTokenMulti3_, helper_.moveFromMulti3());
0051     }
0052 
0053     static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0054       edm::ParameterSetDescription desc;
0055       TestHelperClass::fillPSetDescription(desc);
0056       cms::alpakatest::TestHostOnlyHelperClass::fillPSetDescription(desc);
0057       desc.add<int>("expectedInt");
0058       descriptions.addWithDefaultLabel(desc);
0059     }
0060 
0061   private:
0062     const device::ESGetToken<AlpakaESTestDataDDevice, AlpakaESTestRecordD> esTokenDevice_;
0063     const edm::EDPutTokenT<portabletest::TestHostCollection> putToken_;
0064     const edm::EDPutTokenT<portabletest::TestHostMultiCollection2> putTokenMulti2_;
0065     const edm::EDPutTokenT<portabletest::TestHostMultiCollection3> putTokenMulti3_;
0066 
0067     TestHelperClass helper_;
0068     cms::alpakatest::TestHostOnlyHelperClass const hostHelper_;
0069     int const expectedInt_;
0070   };
0071 
0072 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0073 
0074 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0075 DEFINE_FWK_ALPAKA_MODULE(TestAlpakaStreamSynchronizingProducer);