Skip to content

Commit 495f26b

Browse files
authored
Merge pull request #48378 from alexstrel/Alpaka-math-functions
Replace standard library functions with their Alpaka equivalents
2 parents 043863c + dcf8698 commit 495f26b

File tree

7 files changed

+50
-47
lines changed

7 files changed

+50
-47
lines changed

HeterogeneousCore/AlpakaInterface/interface/HistoContainer.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,11 @@ namespace cms::alpakatools {
9797
}
9898

9999
// iteratate over N bins left and right of the one containing "v"
100-
template <typename Hist, typename V, typename Func>
101-
ALPAKA_FN_ACC ALPAKA_FN_INLINE void forEachInBins(Hist const &hist, V value, int n, Func func) {
100+
template <typename TAcc, typename Hist, typename V, typename Func>
101+
ALPAKA_FN_ACC ALPAKA_FN_INLINE void forEachInBins(const TAcc &acc, Hist const &hist, V value, int n, Func func) {
102102
int bs = Hist::bin(value);
103-
int be = std::min(int(Hist::nbins() - 1), bs + n);
104-
bs = std::max(0, bs - n);
103+
int be = alpaka::math::min(acc, int(Hist::nbins() - 1), bs + n);
104+
bs = alpaka::math::max(acc, 0, bs - n);
105105
ALPAKA_ASSERT_ACC(be >= bs);
106106
for (auto pj = hist.begin(bs); pj < hist.end(be); ++pj) {
107107
func(*pj);

HeterogeneousCore/AlpakaInterface/interface/prefixScan.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ namespace cms::alpakatools {
155155
// first each block does a scan
156156
[[maybe_unused]] int off = elementsPerBlock * blockIdx;
157157
if (size - off > 0) {
158-
blockPrefixScan(acc, ci + off, co + off, std::min(elementsPerBlock, size - off), ws);
158+
blockPrefixScan(acc, ci + off, co + off, alpaka::math::min(acc, elementsPerBlock, size - off), ws);
159159
}
160160

161161
// count blocks that finished

HeterogeneousCore/AlpakaInterface/interface/workdivision.h

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ namespace cms::alpakatools {
1919
// Return the integer division of the first argument by the second argument, rounded up to the next integer
2020
inline constexpr Idx divide_up_by(Idx value, Idx divisor) { return (value + divisor - 1) / divisor; }
2121

22+
// Return the minimum of two values:
23+
inline constexpr Idx idx_min(Idx const x, Idx const y) { return (y > x) ? x : y; }
24+
2225
// Trait describing whether or not the accelerator expects the threads-per-block and elements-per-thread to be swapped
2326
template <typename TAcc, typename = std::enable_if_t<alpaka::isAccelerator<TAcc>>>
2427
struct requires_single_thread_per_block : public std::true_type {};
@@ -186,9 +189,9 @@ namespace cms::alpakatools {
186189
: elements_{elements},
187190
stride_{stride},
188191
extent_{extent},
189-
first_{std::min(first, extent)},
192+
first_{idx_min(first, extent)},
190193
index_{first_},
191-
range_{std::min(first + elements, extent)} {}
194+
range_{idx_min(first + elements, extent)} {}
192195

193196
public:
194197
ALPAKA_FN_ACC inline Idx operator*() const { return index_; }
@@ -205,7 +208,7 @@ namespace cms::alpakatools {
205208
// increment the thread index with the grid stride
206209
first_ += stride_;
207210
index_ = first_;
208-
range_ = std::min(first_ + elements_, extent_);
211+
range_ = idx_min(first_ + elements_, extent_);
209212
if (index_ < extent_)
210213
return *this;
211214

@@ -506,7 +509,7 @@ namespace cms::alpakatools {
506509
overflow = true;
507510
}
508511
index_[I] = first_[I];
509-
range_[I] = std::min(first_[I] + loop_->elements_[I], loop_->extent_[I]);
512+
range_[I] = idx_min(first_[I] + loop_->elements_[I], loop_->extent_[I]);
510513
return overflow;
511514
}
512515

@@ -662,7 +665,7 @@ namespace cms::alpakatools {
662665
friend class UniformGroupsAlong;
663666

664667
ALPAKA_FN_ACC inline const_iterator(Idx stride, Idx extent, Idx first)
665-
: stride_{stride}, extent_{extent}, first_{std::min(first, extent)} {}
668+
: stride_{stride}, extent_{extent}, first_{idx_min(first, extent)} {}
666669

667670
public:
668671
ALPAKA_FN_ACC inline Idx operator*() const { return first_; }
@@ -866,10 +869,10 @@ namespace cms::alpakatools {
866869

867870
ALPAKA_FN_ACC inline UniformGroupElementsAlong(TAcc const& acc, Idx block, Idx extent)
868871
: first_{block * alpaka::getWorkDiv<alpaka::Block, alpaka::Elems>(acc)[Dim]},
869-
local_{std::min(extent - first_,
870-
alpaka::getIdx<alpaka::Block, alpaka::Threads>(acc)[Dim] *
871-
alpaka::getWorkDiv<alpaka::Thread, alpaka::Elems>(acc)[Dim])},
872-
range_{std::min(extent - first_, local_ + alpaka::getWorkDiv<alpaka::Thread, alpaka::Elems>(acc)[Dim])} {}
872+
local_{idx_min(extent - first_,
873+
alpaka::getIdx<alpaka::Block, alpaka::Threads>(acc)[Dim] *
874+
alpaka::getWorkDiv<alpaka::Thread, alpaka::Elems>(acc)[Dim])},
875+
range_{idx_min(extent - first_, local_ + alpaka::getWorkDiv<alpaka::Thread, alpaka::Elems>(acc)[Dim])} {}
873876

874877
class const_iterator;
875878
using iterator = const_iterator;
@@ -1086,7 +1089,7 @@ namespace cms::alpakatools {
10861089
friend class IndependentGroupsAlong;
10871090

10881091
ALPAKA_FN_ACC inline const_iterator(Idx stride, Idx extent, Idx first)
1089-
: stride_{stride}, extent_{extent}, first_{std::min(first, extent)} {}
1092+
: stride_{stride}, extent_{extent}, first_{idx_min(first, extent)} {}
10901093

10911094
public:
10921095
ALPAKA_FN_ACC inline Idx operator*() const { return first_; }
@@ -1257,9 +1260,9 @@ namespace cms::alpakatools {
12571260
: elements_{elements},
12581261
stride_{stride},
12591262
extent_{extent},
1260-
first_{std::min(first, extent)},
1263+
first_{idx_min(first, extent)},
12611264
index_{first_},
1262-
range_{std::min(first + elements, extent)} {}
1265+
range_{idx_min(first + elements, extent)} {}
12631266

12641267
public:
12651268
ALPAKA_FN_ACC inline Idx operator*() const { return index_; }
@@ -1276,7 +1279,7 @@ namespace cms::alpakatools {
12761279
// increment the thread index with the block stride
12771280
first_ += stride_;
12781281
index_ = first_;
1279-
range_ = std::min(first_ + elements_, extent_);
1282+
range_ = idx_min(first_ + elements_, extent_);
12801283
if (index_ < extent_)
12811284
return *this;
12821285

HeterogeneousCore/AlpakaInterface/test/alpaka/testOneHistoContainer.dev.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,10 @@ struct mykernel {
109109
auto vm = int(v[j]) - DELTA;
110110
auto vp = int(v[j]) + DELTA;
111111
constexpr int vmax = NBINS != 128 ? NBINS * 2 - 1 : std::numeric_limits<T>::max();
112-
vm = std::max(vm, 0);
113-
vm = std::min(vm, vmax);
114-
vp = std::min(vp, vmax);
115-
vp = std::max(vp, 0);
112+
vm = alpaka::math::max(acc, vm, 0);
113+
vm = alpaka::math::min(acc, vm, vmax);
114+
vp = alpaka::math::min(acc, vp, vmax);
115+
vp = alpaka::math::max(acc, vp, 0);
116116
ALPAKA_ASSERT_ACC(vp >= vm);
117117
forEachInWindow(hist, vm, vp, ftest);
118118
#ifndef NDEBUG

RecoVertex/PixelVertexFinding/plugins/alpaka/clusterTracksByDensity.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
8585
// Equivalent of iz = std::clamp(iz, INT8_MIN, INT8_MAX)
8686
// which doesn't compile with gcc14 due to reference to __glibcxx_assert
8787
// See https://github.com/llvm/llvm-project/issues/95183
88-
int tmp_max = std::max<int>(iz, INT8_MIN);
89-
iz = std::min<int>(tmp_max, INT8_MAX);
88+
int tmp_max = alpaka::math::max(acc, iz, INT8_MIN);
89+
iz = alpaka::math::min(acc, tmp_max, INT8_MAX);
9090
ALPAKA_ASSERT_ACC(iz - INT8_MIN >= 0);
9191
ALPAKA_ASSERT_ACC(iz - INT8_MIN < 256);
9292
izt[i] = iz - INT8_MIN;
@@ -110,10 +110,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
110110
for (auto i : cms::alpakatools::uniform_elements(acc, nt)) {
111111
if (ezt2[i] > errmax2)
112112
continue;
113-
cms::alpakatools::forEachInBins(hist, izt[i], 1, [&](uint32_t j) {
113+
cms::alpakatools::forEachInBins(acc, hist, izt[i], 1, [&](uint32_t j) {
114114
if (i == j)
115115
return;
116-
auto dist = std::abs(zt[i] - zt[j]);
116+
auto dist = alpaka::math::abs(acc, zt[i] - zt[j]);
117117
if (dist > eps)
118118
return;
119119
if (dist * dist > chi2max * (ezt2[i] + ezt2[j]))
@@ -126,12 +126,12 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
126126
// find closest above me .... (we ignore the possibility of two j at same distance from i)
127127
for (auto i : cms::alpakatools::uniform_elements(acc, nt)) {
128128
float mdist = eps;
129-
cms::alpakatools::forEachInBins(hist, izt[i], 1, [&](uint32_t j) {
129+
cms::alpakatools::forEachInBins(acc, hist, izt[i], 1, [&](uint32_t j) {
130130
if (nn[j] < nn[i])
131131
return;
132132
if (nn[j] == nn[i] && zt[j] >= zt[i])
133133
return; // if equal use natural order...
134-
auto dist = std::abs(zt[i] - zt[j]);
134+
auto dist = alpaka::math::abs(acc, zt[i] - zt[j]);
135135
if (dist > mdist)
136136
return;
137137
if (dist * dist > chi2max * (ezt2[i] + ezt2[j]))
@@ -173,12 +173,12 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
173173
for (auto i : cms::alpakatools::uniform_elements(acc, nt)) {
174174
auto minJ = i;
175175
auto mdist = eps;
176-
cms::alpakatools::forEachInBins(hist, izt[i], 1, [&](uint32_t j) {
176+
cms::alpakatools::forEachInBins(acc, hist, izt[i], 1, [&](uint32_t j) {
177177
if (nn[j] < nn[i])
178178
return;
179179
if (nn[j] == nn[i] && zt[j] >= zt[i])
180180
return; // if equal use natural order...
181-
auto dist = std::abs(zt[i] - zt[j]);
181+
auto dist = alpaka::math::abs(acc, zt[i] - zt[j]);
182182
if (dist > mdist)
183183
return;
184184
if (dist * dist > chi2max * (ezt2[i] + ezt2[j]))

RecoVertex/PixelVertexFinding/plugins/alpaka/clusterTracksDBSCAN.h

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
8383
// Equivalent of iz = std::clamp(iz, INT8_MIN, INT8_MAX)
8484
// which doesn't compile with gcc14 due to reference to __glibcxx_assert
8585
// See https://github.com/llvm/llvm-project/issues/95183
86-
int tmp_max = std::max<int>(iz, INT8_MIN);
87-
iz = std::min<int>(tmp_max, INT8_MAX);
86+
int tmp_max = alpaka::math::max<Acc1D, int>(acc, iz, INT8_MIN);
87+
iz = alpaka::math::min<Acc1D, int>(acc, tmp_max, INT8_MAX);
8888
izt[i] = iz - INT8_MIN;
8989
ALPAKA_ASSERT_ACC(iz - INT8_MIN >= 0);
9090
ALPAKA_ASSERT_ACC(iz - INT8_MIN < 256);
@@ -108,10 +108,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
108108
for (auto i : cms::alpakatools::uniform_elements(acc, nt)) {
109109
if (ezt2[i] > errmax2)
110110
continue;
111-
cms::alpakatools::forEachInBins(hist, izt[i], 1, [&](uint32_t j) {
111+
cms::alpakatools::forEachInBins(acc, hist, izt[i], 1, [&](uint32_t j) {
112112
if (i == j)
113113
return;
114-
auto dist = std::abs(zt[i] - zt[j]);
114+
auto dist = alpaka::math::abs(acc, zt[i] - zt[j]);
115115
if (dist > eps)
116116
return;
117117
nn[i]++;
@@ -124,12 +124,12 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
124124
if (nn[i] < minT)
125125
continue; // DBSCAN core rule
126126
float mz = zt[i];
127-
cms::alpakatools::forEachInBins(hist, izt[i], 1, [&](uint32_t j) {
127+
cms::alpakatools::forEachInBins(acc, hist, izt[i], 1, [&](uint32_t j) {
128128
if (zt[j] >= mz)
129129
return;
130130
if (nn[j] < minT)
131131
return; // DBSCAN core rule
132-
auto dist = std::abs(zt[i] - zt[j]);
132+
auto dist = alpaka::math::abs(acc, zt[i] - zt[j]);
133133
if (dist > eps)
134134
return;
135135
mz = zt[j];
@@ -171,10 +171,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
171171
if (nn[i] < minT)
172172
continue; // DBSCAN core rule
173173
ALPAKA_ASSERT_ACC(zt[iv[i]] <= zt[i]);
174-
cms::alpakatools::forEachInBins(hist, izt[i], 1, [&](uint32_t j) {
174+
cms::alpakatools::forEachInBins(acc, hist, izt[i], 1, [&](uint32_t j) {
175175
if (nn[j] < minT)
176176
return; // DBSCAN core rule
177-
auto dist = std::abs(zt[i] - zt[j]);
177+
auto dist = alpaka::math::abs(acc, zt[i] - zt[j]);
178178
if (dist > eps)
179179
return;
180180
// they should belong to the same cluster, isn't it?
@@ -194,10 +194,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
194194
if (nn[i] >= minT)
195195
continue; // DBSCAN edge rule
196196
float mdist = eps;
197-
cms::alpakatools::forEachInBins(hist, izt[i], 1, [&](uint32_t j) {
197+
cms::alpakatools::forEachInBins(acc, hist, izt[i], 1, [&](uint32_t j) {
198198
if (nn[j] < minT)
199199
return; // DBSCAN core rule
200-
auto dist = std::abs(zt[i] - zt[j]);
200+
auto dist = alpaka::math::abs(acc, zt[i] - zt[j]);
201201
if (dist > mdist)
202202
return;
203203
if (dist * dist > chi2max * (ezt2[i] + ezt2[j]))

RecoVertex/PixelVertexFinding/plugins/alpaka/clusterTracksIterative.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
7979
// Equivalent of iz = std::clamp(iz, INT8_MIN, INT8_MAX)
8080
// which doesn't compile with gcc14 due to reference to __glibcxx_assert
8181
// See https://github.com/llvm/llvm-project/issues/95183
82-
int tmp_max = std::max<int>(iz, INT8_MIN);
83-
iz = std::min<int>(tmp_max, INT8_MAX);
82+
int tmp_max = alpaka::math::max<Acc1D, int>(acc, iz, INT8_MIN);
83+
iz = alpaka::math::min<Acc1D, int>(acc, tmp_max, INT8_MAX);
8484
izt[i] = iz - INT8_MIN;
8585
ALPAKA_ASSERT_ACC(iz - INT8_MIN >= 0);
8686
ALPAKA_ASSERT_ACC(iz - INT8_MIN < 256);
@@ -104,7 +104,7 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
104104
for (auto i : cms::alpakatools::uniform_elements(acc, nt)) {
105105
if (ezt2[i] > errmax2)
106106
continue;
107-
cms::alpakatools::forEachInBins(hist, izt[i], 1, [&](uint32_t j) {
107+
cms::alpakatools::forEachInBins(acc, hist, izt[i], 1, [&](uint32_t j) {
108108
if (i == j)
109109
return;
110110
auto dist = std::abs(zt[i] - zt[j]);
@@ -138,13 +138,13 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
138138
++p;
139139
if (nn[i] < minT)
140140
continue; // DBSCAN core rule
141-
auto be = std::min(Hist::bin(izt[i]) + 1, int(hist.nbins() - 1));
141+
auto be = alpaka::math::min(acc, Hist::bin(izt[i]) + 1, int(hist.nbins() - 1));
142142
for (; p < hist.end(be); ++p) {
143143
uint32_t j = *p;
144144
ALPAKA_ASSERT_ACC(i != j);
145145
if (nn[j] < minT)
146146
continue; // DBSCAN core rule
147-
auto dist = std::abs(zt[i] - zt[j]);
147+
auto dist = alpaka::math::abs(acc, zt[i] - zt[j]);
148148
if (dist > eps)
149149
continue;
150150
if (dist * dist > chi2max * (ezt2[i] + ezt2[j]))
@@ -168,10 +168,10 @@ namespace ALPAKA_ACCELERATOR_NAMESPACE::vertexFinder {
168168
if (nn[i] >= minT)
169169
continue; // DBSCAN edge rule
170170
float mdist = eps;
171-
cms::alpakatools::forEachInBins(hist, izt[i], 1, [&](int j) {
171+
cms::alpakatools::forEachInBins(acc, hist, izt[i], 1, [&](int j) {
172172
if (nn[j] < minT)
173173
return; // DBSCAN core rule
174-
auto dist = std::abs(zt[i] - zt[j]);
174+
auto dist = alpaka::math::abs(acc, zt[i] - zt[j]);
175175
if (dist > mdist)
176176
return;
177177
if (dist * dist > chi2max * (ezt2[i] + ezt2[j]))

0 commit comments

Comments
 (0)