forked from AliceO2Group/AliceO2
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGPUTPCCFCheckPadBaseline.h
More file actions
91 lines (73 loc) · 3.32 KB
/
GPUTPCCFCheckPadBaseline.h
File metadata and controls
91 lines (73 loc) · 3.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
// All rights not expressly granted are reserved.
//
// This software is distributed under the terms of the GNU General Public
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
//
// In applying this license CERN does not waive the privileges and immunities
// granted to it by virtue of its status as an Intergovernmental Organization
// or submit itself to any jurisdiction.
/// \file GPUTPCCFCheckPadBaseline.h
/// \author Felix Weiglhofer
///
/// Kernel identifies noisy TPC pads by analyzing charge patterns over time.
/// A pad is marked noisy if it exceeds thresholds for total or consecutive
/// time bins with charge, unless the charge exceeds a saturation threshold.
#ifndef O2_GPU_GPU_TPC_CF_CHECK_PAD_BASELINE_H
#define O2_GPU_GPU_TPC_CF_CHECK_PAD_BASELINE_H
#include "GPUGeneralKernels.h"
#include "GPUConstantMem.h"
#include "GPUTPCGeometry.h"
#include "clusterFinderDefs.h"
#include "CfArray2D.h"
namespace o2::gpu
{
class GPUTPCCFCheckPadBaseline : public GPUKernelTemplate
{
public:
enum {
PadsPerCacheline = TPCMapMemoryLayout<uint16_t>::Width,
TimebinsPerCacheline = TPCMapMemoryLayout<uint16_t>::Height,
EntriesPerCacheline = PadsPerCacheline * TimebinsPerCacheline,
NumOfCachedPads = GPUCA_WARP_SIZE / TimebinsPerCacheline,
NumCLsPerWarp = GPUCA_WARP_SIZE / EntriesPerCacheline,
NumOfCachedTBs = TimebinsPerCacheline,
// Threads index shared memory as [iThread / MaxNPadsPerRow][iThread % MaxNPadsPerRow].
// Rounding up to a multiple of PadsPerCacheline ensures iThread / MaxNPadsPerRow < NumOfCachedTBs
// for all threads, avoiding out-of-bounds access.
MaxNPadsPerRow = CAMath::nextMultipleOf<PadsPerCacheline>(GPUTPCGeometry::MaxNPadsPerRow()),
};
struct GPUSharedMemory {
tpccf::Charge charges[NumOfCachedTBs][MaxNPadsPerRow];
};
typedef GPUTPCClusterFinder processorType;
GPUhdi() static processorType* Processor(GPUConstantMem& processors)
{
return processors.tpcClusterer;
}
GPUhdi() constexpr static gpudatatypes::RecoStep GetRecoStep()
{
return gpudatatypes::RecoStep::TPCClusterFinding;
}
static int32_t GetNBlocks(bool isGPU)
{
const int32_t nBlocks = TPC_PADS_IN_SECTOR / PadsPerCacheline;
return isGPU ? GPUCA_ROW_COUNT : nBlocks;
}
template <int32_t iKernel = defaultKernel>
GPUd() static void Thread(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUSharedMemory& smem, processorType& clusterer);
private:
GPUd() static void CheckBaselineGPU(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUSharedMemory& smem, processorType& clusterer);
GPUd() static void CheckBaselineCPU(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUSharedMemory& smem, processorType& clusterer);
template <int32_t PadsPerBlock>
GPUd() static CfChargePos padToCfChargePos(int32_t& pad, const GPUTPCClusterFinder&, int32_t& padsPerRow);
struct RowInfo {
int16_t globalPadOffset;
int16_t nPads;
};
GPUd() static RowInfo GetRowInfo(int16_t row);
GPUd() static void updatePadBaseline(int32_t pad, const GPUTPCClusterFinder&, int32_t totalCharges, int32_t consecCharges, tpccf::Charge maxCharge);
};
} // namespace o2::gpu
#endif