Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:28:38

0001 #include <cuda_runtime.h>
0002 #include <Eigen/Core>  // needed here by soa layout
0003 
0004 #include "CUDADataFormats/Common/interface/Product.h"
0005 #include "DataFormats/Common/interface/Handle.h"
0006 #include "FWCore/Framework/interface/ConsumesCollector.h"
0007 #include "FWCore/Framework/interface/Event.h"
0008 #include "FWCore/Framework/interface/EventSetup.h"
0009 #include "FWCore/Framework/interface/MakerMacros.h"
0010 #include "FWCore/Framework/interface/global/EDAnalyzer.h"
0011 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0013 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0014 #include "FWCore/PluginManager/interface/ModuleDef.h"
0015 #include "FWCore/Utilities/interface/EDGetToken.h"
0016 #include "FWCore/Utilities/interface/InputTag.h"
0017 #include "FWCore/Utilities/interface/RunningAverage.h"
0018 #include "HeterogeneousCore/CUDACore/interface/ScopedContext.h"
0019 #include "RecoTracker/TkMSParametrization/interface/PixelRecoUtilities.h"
0020 
0021 #include "CUDADataFormats/Vertex/interface/ZVertexSoAHeterogeneousHost.h"
0022 #include "CUDADataFormats/Vertex/interface/ZVertexSoAHeterogeneousDevice.h"
0023 
0024 #include "CUDADataFormats/Track/interface/TrackSoAHeterogeneousDevice.h"
0025 #include "CUDADataFormats/Track/interface/TrackSoAHeterogeneousHost.h"
0026 
0027 template <typename TrackerTraits>
0028 class PixelTrackDumpCUDAT : public edm::global::EDAnalyzer<> {
0029 public:
0030   using TrackSoAHost = TrackSoAHeterogeneousHost<TrackerTraits>;
0031   using TrackSoADevice = TrackSoAHeterogeneousDevice<TrackerTraits>;
0032 
0033   using VertexSoAHost = ZVertexSoAHost;
0034   using VertexSoADevice = ZVertexSoADevice;
0035 
0036   explicit PixelTrackDumpCUDAT(const edm::ParameterSet& iConfig);
0037   ~PixelTrackDumpCUDAT() override = default;
0038 
0039   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0040 
0041 private:
0042   void analyze(edm::StreamID streamID, edm::Event const& iEvent, const edm::EventSetup& iSetup) const override;
0043   const bool m_onGPU;
0044   edm::EDGetTokenT<cms::cuda::Product<TrackSoADevice>> tokenGPUTrack_;
0045   edm::EDGetTokenT<cms::cuda::Product<VertexSoADevice>> tokenGPUVertex_;
0046   edm::EDGetTokenT<TrackSoAHost> tokenSoATrack_;
0047   edm::EDGetTokenT<VertexSoAHost> tokenSoAVertex_;
0048 };
0049 
0050 template <typename TrackerTraits>
0051 PixelTrackDumpCUDAT<TrackerTraits>::PixelTrackDumpCUDAT(const edm::ParameterSet& iConfig)
0052     : m_onGPU(iConfig.getParameter<bool>("onGPU")) {
0053   if (m_onGPU) {
0054     tokenGPUTrack_ = consumes(iConfig.getParameter<edm::InputTag>("pixelTrackSrc"));
0055     tokenGPUVertex_ = consumes(iConfig.getParameter<edm::InputTag>("pixelVertexSrc"));
0056   } else {
0057     tokenSoATrack_ = consumes(iConfig.getParameter<edm::InputTag>("pixelTrackSrc"));
0058     tokenSoAVertex_ = consumes(iConfig.getParameter<edm::InputTag>("pixelVertexSrc"));
0059   }
0060 }
0061 
0062 template <typename TrackerTraits>
0063 void PixelTrackDumpCUDAT<TrackerTraits>::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0064   edm::ParameterSetDescription desc;
0065 
0066   desc.add<bool>("onGPU", true);
0067   desc.add<edm::InputTag>("pixelTrackSrc", edm::InputTag("pixelTracksCUDA"));
0068   desc.add<edm::InputTag>("pixelVertexSrc", edm::InputTag("pixelVerticesCUDA"));
0069   descriptions.addWithDefaultLabel(desc);
0070 }
0071 
0072 template <typename TrackerTraits>
0073 void PixelTrackDumpCUDAT<TrackerTraits>::analyze(edm::StreamID streamID,
0074                                                  edm::Event const& iEvent,
0075                                                  const edm::EventSetup& iSetup) const {
0076   if (m_onGPU) {
0077     auto const& hTracks = iEvent.get(tokenGPUTrack_);
0078     cms::cuda::ScopedContextProduce ctx{hTracks};
0079 
0080     auto const& tracks = ctx.get(hTracks);
0081     auto const* tsoa = &tracks;
0082     assert(tsoa->buffer());
0083 
0084     auto const& vertices = ctx.get(iEvent.get(tokenGPUVertex_));
0085     auto const* vsoa = &vertices;
0086     assert(vsoa->buffer());
0087 
0088   } else {
0089     auto const& tsoa = iEvent.get(tokenSoATrack_);
0090     assert(tsoa.buffer());
0091 
0092     auto const& vsoa = iEvent.get(tokenSoAVertex_);
0093     assert(vsoa.buffer());
0094   }
0095 }
0096 
0097 using PixelTrackDumpCUDAPhase1 = PixelTrackDumpCUDAT<pixelTopology::Phase1>;
0098 DEFINE_FWK_MODULE(PixelTrackDumpCUDAPhase1);
0099 
0100 using PixelTrackDumpCUDAPhase2 = PixelTrackDumpCUDAT<pixelTopology::Phase2>;
0101 DEFINE_FWK_MODULE(PixelTrackDumpCUDAPhase2);
0102 
0103 using PixelTrackDumpCUDAHIonPhase1 = PixelTrackDumpCUDAT<pixelTopology::HIonPhase1>;
0104 DEFINE_FWK_MODULE(PixelTrackDumpCUDAHIonPhase1);