File indexing completed on 2023-03-31 23:02:21
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);