Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-28 01:34:33

0001 #ifndef RecoLocalTracker_SiStripClusterizer_plugins_SiStripRawToClusterGPUKernel_h
0002 #define RecoLocalTracker_SiStripClusterizer_plugins_SiStripRawToClusterGPUKernel_h
0003 
0004 #include "HeterogeneousCore/CUDAUtilities/interface/device_unique_ptr.h"
0005 #include "CUDADataFormats/SiStripCluster/interface/SiStripClustersCUDA.h"
0006 
0007 #include "CalibFormats/SiStripObjects/interface/SiStripClusterizerConditionsGPU.h"
0008 //#include "clusterGPU.cuh"
0009 
0010 #include <cuda_runtime.h>
0011 
0012 #include <vector>
0013 #include <memory>
0014 
0015 class ChannelLocs;
0016 class ChannelLocsGPU;
0017 class FEDRawData;
0018 
0019 namespace sistrip {
0020   class FEDBuffer;
0021 }
0022 namespace edm {
0023   class ParameterSet;
0024 }
0025 
0026 namespace stripgpu {
0027   struct StripDataView;
0028 
0029   class StripDataGPU {
0030   public:
0031     StripDataGPU(size_t size, cudaStream_t stream);
0032 
0033     cms::cuda::device::unique_ptr<uint8_t[]> alldataGPU_;
0034     cms::cuda::device::unique_ptr<uint16_t[]> channelGPU_;
0035     cms::cuda::device::unique_ptr<stripgpu::stripId_t[]> stripIdGPU_;
0036     cms::cuda::device::unique_ptr<int[]> seedStripsMask_;
0037     cms::cuda::device::unique_ptr<int[]> prefixSeedStripsNCMask_;
0038   };
0039 
0040   class SiStripRawToClusterGPUKernel {
0041   public:
0042     SiStripRawToClusterGPUKernel(const edm::ParameterSet& conf);
0043     void makeAsync(const std::vector<const FEDRawData*>& rawdata,
0044                    const std::vector<std::unique_ptr<sistrip::FEDBuffer>>& buffers,
0045                    const SiStripClusterizerConditionsGPU& conditions,
0046                    cudaStream_t stream);
0047     void copyAsync(cudaStream_t stream);
0048     SiStripClustersCUDADevice getResults(cudaStream_t stream);
0049 
0050   private:
0051     using ConditionsDeviceView = SiStripClusterizerConditionsGPU::Data::DeviceView;
0052 
0053     void reset();
0054     void unpackChannelsGPU(const ConditionsDeviceView* conditions, cudaStream_t stream);
0055     void allocateSSTDataGPU(int max_strips, cudaStream_t stream);
0056     void freeSSTDataGPU(cudaStream_t stream);
0057 
0058     void setSeedStripsNCIndexGPU(const ConditionsDeviceView* conditions, cudaStream_t stream);
0059     void findClusterGPU(const ConditionsDeviceView* conditions, cudaStream_t stream);
0060 
0061     std::vector<stripgpu::fedId_t> fedIndex_;
0062     std::vector<size_t> fedRawDataOffsets_;
0063 
0064     std::unique_ptr<StripDataGPU> stripdata_;
0065     std::unique_ptr<ChannelLocsGPU> chanlocsGPU_;
0066 
0067     cms::cuda::host::unique_ptr<StripDataView> sst_data_d_;
0068     cms::cuda::device::unique_ptr<StripDataView> pt_sst_data_d_;
0069 
0070     SiStripClustersCUDADevice clusters_d_;
0071     float channelThreshold_, seedThreshold_, clusterThresholdSquared_;
0072     uint8_t maxSequentialHoles_, maxSequentialBad_, maxAdjacentBad_;
0073     uint32_t maxClusterSize_;
0074     float minGoodCharge_;
0075   };
0076 }  // namespace stripgpu
0077 #endif