Back to home page

Project CMSSW displayed by LXR

 
 

    


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

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         : SynchronizingEDProducer<>(iConfig),
0029           esTokenDevice_(esConsumes()),
0030           putToken_{produces()},
0031           putTokenMulti2_{produces()},
0032           putTokenMulti3_{produces()},
0033           helper_{iConfig, consumesCollector()},
0034           hostHelper_{iConfig, consumesCollector()},
0035           expectedInt_{iConfig.getParameter<int>("expectedInt")} {}
0036 
0037     void acquire(device::Event const& iEvent, device::EventSetup const& iSetup) override {
0038       [[maybe_unused]] auto const& esData = iSetup.getData(esTokenDevice_);
0039 
0040       int const value = hostHelper_.run(iEvent, iSetup);
0041       if (value != expectedInt_) {
0042         throw cms::Exception("Assert") << "Expected value " << expectedInt_ << ", but got " << value;
0043       }
0044 
0045       helper_.makeAsync(iEvent, iSetup);
0046     }
0047 
0048     void produce(device::Event& iEvent, device::EventSetup const& iSetup) override {
0049       iEvent.emplace(putToken_, helper_.moveFrom());
0050       iEvent.emplace(putTokenMulti2_, helper_.moveFromMulti2());
0051       iEvent.emplace(putTokenMulti3_, helper_.moveFromMulti3());
0052     }
0053 
0054     static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0055       edm::ParameterSetDescription desc;
0056       TestHelperClass::fillPSetDescription(desc);
0057       cms::alpakatest::TestHostOnlyHelperClass::fillPSetDescription(desc);
0058       desc.add<int>("expectedInt");
0059       descriptions.addWithDefaultLabel(desc);
0060     }
0061 
0062   private:
0063     const device::ESGetToken<AlpakaESTestDataDDevice, AlpakaESTestRecordD> esTokenDevice_;
0064     const edm::EDPutTokenT<portabletest::TestHostCollection> putToken_;
0065     const edm::EDPutTokenT<portabletest::TestHostMultiCollection2> putTokenMulti2_;
0066     const edm::EDPutTokenT<portabletest::TestHostMultiCollection3> putTokenMulti3_;
0067 
0068     TestHelperClass helper_;
0069     cms::alpakatest::TestHostOnlyHelperClass const hostHelper_;
0070     int const expectedInt_;
0071   };
0072 
0073 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0074 
0075 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/MakerMacros.h"
0076 DEFINE_FWK_ALPAKA_MODULE(TestAlpakaStreamSynchronizingProducer);