Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-11-11 23:31:37

0001 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0002 #include "FWCore/Utilities/interface/ESGetToken.h"
0003 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ESProducer.h"
0004 #include "HeterogeneousCore/AlpakaCore/interface/alpaka/ModuleFactory.h"
0005 #include "HeterogeneousCore/AlpakaInterface/interface/config.h"
0006 #include "HeterogeneousCore/AlpakaInterface/interface/host.h"
0007 #include "HeterogeneousCore/AlpakaInterface/interface/memory.h"
0008 #include "HeterogeneousCore/AlpakaTest/interface/AlpakaESTestRecords.h"
0009 #include "HeterogeneousCore/AlpakaTest/interface/AlpakaESTestSoA.h"
0010 #include "HeterogeneousCore/AlpakaTest/interface/ESTestData.h"
0011 #include "HeterogeneousCore/AlpakaTest/interface/alpaka/AlpakaESTestData.h"
0012 
0013 namespace ALPAKA_ACCELERATOR_NAMESPACE {
0014   /**
0015    * This class is the equivalent of TesAlpakaESProducerA.cc
0016    * for PortableHostMultiCollection. It consumes a standard
0017    * host ESProduct and converts the data into PortableHostMultiCollection, and
0018    * implicitly transfers the data product to device
0019    */
0020   class TestAlpakaESProducerAMulti : public ESProducer {
0021   public:
0022     TestAlpakaESProducerAMulti(edm::ParameterSet const& iConfig) : ESProducer(iConfig) {
0023       auto cc = setWhatProduced(this);
0024       token_ = cc.consumes();
0025     }
0026 
0027     static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0028       edm::ParameterSetDescription desc;
0029       descriptions.addWithDefaultLabel(desc);
0030     }
0031 
0032     std::optional<AlpakaESTestDataACMultiHost> produce(AlpakaESTestRecordA const& iRecord) {
0033       auto const& input = iRecord.get(token_);
0034 
0035       int const sizeA = 10;
0036       int const sizeC = 100;
0037       // TODO: pinned allocation?
0038       // TODO: cached allocation?
0039       AlpakaESTestDataACMultiHost product({{sizeA, sizeC}}, cms::alpakatools::host());
0040       auto viewA = product.view<
0041           cms::alpakatest::AlpakaESTestSoAA>();  // this template is not really needed as this is fhe first layout
0042       auto viewC = product.view<cms::alpakatest::AlpakaESTestSoAC>();
0043 
0044       for (int i = 0; i < sizeA; ++i) {
0045         viewA[i].z() = input.value() - i;
0046       }
0047 
0048       for (int i = 0; i < sizeC; ++i) {
0049         viewC[i].x() = input.value() + i;
0050       }
0051 
0052       return product;
0053     }
0054 
0055   private:
0056     edm::ESGetToken<cms::alpakatest::ESTestDataA, AlpakaESTestRecordA> token_;
0057   };
0058 }  // namespace ALPAKA_ACCELERATOR_NAMESPACE
0059 
0060 DEFINE_FWK_EVENTSETUP_ALPAKA_MODULE(TestAlpakaESProducerAMulti);