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
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 }
0077 #endif