Project
Loading...
Searching...
No Matches
GPUTPCCFMCLabelFlattener.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
14
16
17#if !defined(GPUCA_GPUCODE)
18#include "GPUHostDataTypes.h"
19#endif
20
21using namespace o2::gpu;
22using namespace o2::gpu::tpccf;
23
24#if !defined(GPUCA_GPUCODE)
27 GPUTPCLinearLabels& labels)
28{
29 uint32_t headerOffset = labels.header.size();
30 uint32_t dataOffset = labels.data.size();
31
32 cls.mPlabelsHeaderGlobalOffset = headerOffset;
33 cls.mPlabelsDataGlobalOffset = dataOffset;
34
35 for (Row row = 0; row < GPUCA_ROW_COUNT; row++) {
36 headerOffset += cls.mPclusterInRow[row];
37 dataOffset += cls.mPlabelsInRow[row];
38 }
39
40 labels.header.resize(headerOffset);
41 labels.data.resize(dataOffset);
42}
43#endif
44
45template <>
46GPUd() void GPUTPCCFMCLabelFlattener::Thread<GPUTPCCFMCLabelFlattener::setRowOffsets>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUSharedMemory&, processorType& clusterer)
47{
48#if !defined(GPUCA_GPUCODE)
50
51 uint32_t clusterInRow = clusterer.mPclusterInRow[row];
52 uint32_t labelCount = 0;
53
54 for (uint32_t i = 0; i < clusterInRow; i++) {
55 auto& interim = clusterer.mPlabelsByRow[row].data[i];
56 labelCount += interim.labels.size();
57 }
58
59 clusterer.mPlabelsInRow[row] = labelCount;
60#endif
61}
62
63template <>
64GPUd() void GPUTPCCFMCLabelFlattener::Thread<GPUTPCCFMCLabelFlattener::flatten>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUSharedMemory&, processorType& clusterer, GPUTPCLinearLabels* out)
65{
66#if !defined(GPUCA_GPUCODE)
67 uint32_t row = get_global_id(0);
68
69 uint32_t headerOffset = clusterer.mPlabelsHeaderGlobalOffset;
70 uint32_t dataOffset = clusterer.mPlabelsDataGlobalOffset;
71 for (uint32_t r = 0; r < row; r++) {
72 headerOffset += clusterer.mPclusterInRow[r];
73 dataOffset += clusterer.mPlabelsInRow[r];
74 }
75
76 auto* labels = clusterer.mPlabelsByRow[row].data.data();
77 for (uint32_t c = 0; c < clusterer.mPclusterInRow[row]; c++) {
78 GPUTPCClusterMCInterim& interim = labels[c];
79 assert(dataOffset + interim.labels.size() <= out->data.size());
80 out->header[headerOffset] = dataOffset;
81 std::copy(interim.labels.cbegin(), interim.labels.cend(), out->data.begin() + dataOffset);
82
83 headerOffset++;
84 dataOffset += interim.labels.size();
85 interim = {}; // ensure interim labels are destroyed to prevent memleak
86 }
87#endif
88}
int32_t i
#define get_global_id(dim)
#define GPUCA_ROW_COUNT
uint32_t c
Definition RawData.h:2
static void setGlobalOffsetsAndAllocate(GPUTPCClusterFinder &, GPUTPCLinearLabels &)
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLboolean r
Definition glcorearb.h:1233
GPUd() const expr uint32_t MultivariatePolynomialHelper< Dim
std::vector< o2::MCCompLabel > labels
std::vector< o2::MCCompLabel > data
std::vector< o2::dataformats::MCTruthHeaderElement > header
std::vector< int > row