DPNP C++ backend kernel library 0.20.0dev4
Data Parallel Extension for NumPy*
Loading...
Searching...
No Matches
histogram.hpp
1//*****************************************************************************
2// Copyright (c) 2026, Intel Corporation
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are met:
7// - Redistributions of source code must retain the above copyright notice,
8// this list of conditions and the following disclaimer.
9// - Redistributions in binary form must reproduce the above copyright notice,
10// this list of conditions and the following disclaimer in the documentation
11// and/or other materials provided with the distribution.
12// - Neither the name of the copyright holder nor the names of its contributors
13// may be used to endorse or promote products derived from this software
14// without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
26// THE POSSIBILITY OF SUCH DAMAGE.
27//*****************************************************************************
28
29#pragma once
30
31#include <cstddef>
32#include <cstdint>
33
34#include <sycl/sycl.hpp>
35
36namespace dpnp::kernels::histogram
37{
38template <typename T, typename HistImpl, typename Edges, typename Weights>
40{
41private:
42 const T *in = nullptr;
43 const std::size_t size;
44 const std::size_t dims;
45 const std::uint32_t WorkPI;
46 const HistImpl hist;
47 const Edges edges;
48 const Weights weights;
49
50public:
51 HistogramFunctor(const T *in_,
52 const std::size_t size_,
53 const std::size_t dims_,
54 const std::uint32_t WorkPI_,
55 const HistImpl &hist_,
56 const Edges &edges_,
57 const Weights &weights_)
58 : in(in_), size(size_), dims(dims_), WorkPI(WorkPI_), hist(hist_),
59 edges(edges_), weights(weights_)
60 {
61 }
62
63 void operator()(sycl::nd_item<1> item) const
64 {
65 auto id = item.get_group_linear_id();
66 auto lid = item.get_local_linear_id();
67 auto group = item.get_group();
68 auto local_size = item.get_local_range(0);
69
70 hist.init(item);
71 edges.init(item);
72
73 if constexpr (HistImpl::sync_after_init || Edges::sync_after_init) {
74 sycl::group_barrier(group, sycl::memory_scope::work_group);
75 }
76
77 auto bounds = edges.get_bounds();
78
79 for (std::uint32_t i = 0; i < WorkPI; ++i) {
80 auto data_idx = id * WorkPI * local_size + i * local_size + lid;
81 if (data_idx < size) {
82 auto *d = &in[data_idx * dims];
83
84 if (edges.in_bounds(d, bounds)) {
85 auto bin = edges.get_bin(item, d, bounds);
86 auto weight = weights.get(data_idx);
87 hist.add(item, bin, weight);
88 }
89 }
90 }
91
92 if constexpr (HistImpl::sync_before_finalize) {
93 sycl::group_barrier(group, sycl::memory_scope::work_group);
94 }
95
96 hist.finalize(item);
97 }
98};
99} // namespace dpnp::kernels::histogram