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)
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 < GPUTPCGeometry::NROWS; 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)
49 const Row row = get_global_id(0);
50 const size_t clusterInRow = clusterer.mPclusterInRow[row];
51
52 // Label Flattener assumes 1 label container per cluster,
53 // but HIP clusters don't support MC labels yet and containers are missing for those clusters.
54 // So append empty label container for each HIP cluster.
55 // Note: This assumes that HIP cluster are store behind regular clusters!
56 auto& labels = clusterer.mPlabelsByRow[row].data;
57 labels.resize(std::max(labels.size(), clusterInRow));
58
59 uint32_t labelCount = 0;
60
61 for (size_t i = 0; i < clusterInRow; i++) {
62 auto& interim = labels[i];
63 labelCount += interim.labels.size();
64 }
65
66 clusterer.mPlabelsInRow[row] = labelCount;
67#endif
68}
69
70template <>
71GPUd() void GPUTPCCFMCLabelFlattener::Thread<GPUTPCCFMCLabelFlattener::flatten>(int32_t nBlocks, int32_t nThreads, int32_t iBlock, int32_t iThread, GPUSharedMemory&, processorType& clusterer, GPUTPCLinearLabels* out)
72{
73#if !defined(GPUCA_GPUCODE)
74 uint32_t row = get_global_id(0);
75
76 uint32_t headerOffset = clusterer.mPlabelsHeaderGlobalOffset;
77 uint32_t dataOffset = clusterer.mPlabelsDataGlobalOffset;
78 for (uint32_t r = 0; r < row; r++) {
79 headerOffset += clusterer.mPclusterInRow[r];
80 dataOffset += clusterer.mPlabelsInRow[r];
81 }
82
83 auto* labels = clusterer.mPlabelsByRow[row].data.data();
84 for (uint32_t c = 0; c < clusterer.mPclusterInRow[row]; c++) {
86 assert(dataOffset + interim.labels.size() <= out->data.size());
87 out->header[headerOffset] = dataOffset;
88 std::copy(interim.labels.cbegin(), interim.labels.cend(), out->data.begin() + dataOffset);
89
90 headerOffset++;
91 dataOffset += interim.labels.size();
92 interim = {}; // ensure interim labels are destroyed to prevent memleak
93 }
94#endif
95}
std::vector< std::string > labels
int32_t i
#define get_global_id(dim)
uint32_t c
Definition RawData.h:2
static void setGlobalOffsetsAndAllocate(GPUTPCClusterFinder &, GPUTPCLinearLabels &)
static constexpr uint32_t NROWS
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< int > row