10 #ifndef TPETRA_DETAILS_COMPUTEOFFSETS_HPP
11 #define TPETRA_DETAILS_COMPUTEOFFSETS_HPP
20 #include "TpetraCore_config.h"
23 #include <type_traits>
43 template <
class OffsetType,
46 class ComputeOffsetsFromCounts {
48 static_assert(std::is_integral<OffsetType>::value,
49 "OffsetType must be a built-in integer.");
50 static_assert(std::is_integral<CountType>::value,
51 "CountType must be a built-in integer.");
52 static_assert(std::is_integral<SizeType>::value,
53 "SizeType must be a built-in integer.");
55 using offsets_view_type =
56 Kokkos::View<OffsetType*, Kokkos::AnonymousSpace>;
57 using counts_view_type =
58 Kokkos::View<const CountType*, Kokkos::AnonymousSpace>;
65 ComputeOffsetsFromCounts(
const offsets_view_type& offsets,
66 const counts_view_type& counts)
69 ,
size_(counts.extent(0)) {}
72 KOKKOS_INLINE_FUNCTION
void
73 operator()(
const SizeType i, OffsetType& update,
74 const bool finalPass)
const {
75 const auto curVal = (i <
size_) ?
counts_[i] : OffsetType();
79 update += (i <
size_) ? curVal : OffsetType();
82 template <
class ExecutionSpace>
84 run(
const ExecutionSpace& execSpace,
85 const offsets_view_type& offsets,
86 const counts_view_type& counts) {
87 const SizeType numCounts(counts.extent(0));
88 using range_type = Kokkos::RangePolicy<ExecutionSpace, SizeType>;
89 range_type range(execSpace, 0, numCounts + SizeType(1));
91 ComputeOffsetsFromCounts<OffsetType, CountType, SizeType>;
92 functor_type functor(offsets, counts);
94 const char funcName[] =
"Tpetra::Details::computeOffsetsFromCounts";
95 Kokkos::parallel_scan(funcName, range, functor, total);
117 template <
class OffsetType,
120 class ComputeOffsetsFromConstantCount {
122 static_assert(std::is_integral<OffsetType>::value,
123 "OffsetType must be a built-in integer.");
124 static_assert(std::is_integral<CountType>::value,
125 "CountType must be a built-in integer.");
126 static_assert(std::is_integral<SizeType>::value,
127 "SizeType must be a built-in integer.");
129 using offsets_view_type =
130 Kokkos::View<OffsetType*, Kokkos::AnonymousSpace>;
137 ComputeOffsetsFromConstantCount(
const offsets_view_type& offsets,
138 const CountType count)
143 KOKKOS_INLINE_FUNCTION
void
144 operator()(
const SizeType i)
const {
148 template <
class ExecutionSpace>
150 run(
const ExecutionSpace& execSpace,
151 const offsets_view_type& offsets,
152 const CountType count) {
153 const SizeType numOffsets(offsets.extent(0));
154 if (numOffsets == SizeType(0)) {
158 using range_type = Kokkos::RangePolicy<ExecutionSpace, SizeType>;
159 range_type range(execSpace, 0, numOffsets);
161 ComputeOffsetsFromConstantCount<OffsetType, CountType, SizeType>;
162 functor_type functor(offsets, count);
163 const OffsetType total = (numOffsets - 1) * count;
164 const char funcName[] =
165 "Tpetra::Details::computeOffsetsFromConstantCount";
166 Kokkos::parallel_for(funcName, range, functor);
204 template <
class ExecutionSpace,
205 class OffsetsViewType,
206 class CountsViewType,
207 class SizeType =
typename OffsetsViewType::size_type>
208 typename OffsetsViewType::non_const_value_type
210 const OffsetsViewType& ptr,
211 const CountsViewType& counts) {
212 static_assert(Kokkos::is_execution_space<ExecutionSpace>::value,
213 "ExecutionSpace must be a Kokkos execution space.");
214 static_assert(Kokkos::is_view<OffsetsViewType>::value,
215 "OffsetsViewType (the type of ptr) must be a Kokkos::View.");
216 static_assert(Kokkos::is_view<CountsViewType>::value,
217 "CountsViewType (the type of counts) must be a Kokkos::View.");
218 static_assert(std::is_same<
typename OffsetsViewType::value_type,
219 typename OffsetsViewType::non_const_value_type>::value,
220 "OffsetsViewType (the type of ptr) must be a nonconst Kokkos::View.");
221 static_assert(static_cast<int>(OffsetsViewType::rank) == 1,
222 "OffsetsViewType (the type of ptr) must be a rank-1 Kokkos::View.");
223 static_assert(static_cast<int>(CountsViewType::rank) == 1,
224 "CountsViewType (the type of counts) must be a rank-1 Kokkos::View.");
226 using offset_type =
typename OffsetsViewType::non_const_value_type;
227 static_assert(std::is_integral<offset_type>::value,
228 "The entries of ptr must be built-in integers.");
229 using count_type =
typename CountsViewType::non_const_value_type;
230 static_assert(std::is_integral<count_type>::value,
231 "The entries of counts must be built-in integers.");
232 static_assert(std::is_integral<SizeType>::value,
233 "SizeType must be a built-in integer type.");
235 const char funcName[] =
"Tpetra::Details::computeOffsetsFromCounts";
237 const auto numOffsets = ptr.size();
238 const auto numCounts = counts.size();
239 offset_type total(0);
241 if (numOffsets != 0) {
242 TEUCHOS_TEST_FOR_EXCEPTION(numCounts >= numOffsets, std::invalid_argument, funcName <<
": counts.size() = " << numCounts <<
" >= ptr.size() = " << numOffsets <<
".");
244 using Kokkos::AnonymousSpace;
246 View<offset_type*, AnonymousSpace> ptr_a = ptr;
247 View<const count_type*, AnonymousSpace> counts_a;
249 using offsets_device_type =
typename OffsetsViewType::device_type;
250 using counts_copy_type = View<count_type*, offsets_device_type>;
251 counts_copy_type counts_copy;
253 using offsets_memory_space =
254 typename offsets_device_type::memory_space;
255 using counts_memory_space =
typename CountsViewType::memory_space;
256 constexpr
bool countsAccessibleFromOffsetsExecSpace =
257 Kokkos::SpaceAccessibility<
258 offsets_memory_space, counts_memory_space>::accessible;
259 if (countsAccessibleFromOffsetsExecSpace) {
266 using Kokkos::view_alloc;
267 using Kokkos::WithoutInitializing;
268 counts_copy = counts_copy_type(view_alloc(
"counts_copy", WithoutInitializing), numCounts);
270 counts_a = counts_copy;
274 ComputeOffsetsFromCounts<offset_type, count_type, SizeType>;
275 total = functor_type::run(execSpace, ptr_a, counts_a);
282 template <
class OffsetsViewType,
283 class CountsViewType,
284 class SizeType =
typename OffsetsViewType::size_type>
285 typename OffsetsViewType::non_const_value_type
287 const CountsViewType& counts) {
288 using execution_space =
typename OffsetsViewType::execution_space;
314 template <
class OffsetsViewType,
316 class SizeType =
typename OffsetsViewType::size_type>
317 typename OffsetsViewType::non_const_value_type
319 const CountType count) {
320 static_assert(Kokkos::is_view<OffsetsViewType>::value,
321 "ptr must be a Kokkos::View.");
322 static_assert(std::is_same<
typename OffsetsViewType::value_type,
323 typename OffsetsViewType::non_const_value_type>::value,
324 "ptr must be a nonconst Kokkos::View.");
325 static_assert(static_cast<int>(OffsetsViewType::rank) == 1,
326 "ptr must be a rank-1 Kokkos::View.");
328 using offset_type =
typename OffsetsViewType::non_const_value_type;
329 static_assert(std::is_integral<offset_type>::value,
330 "The type of each entry of ptr must be a "
331 "built-in integer.");
332 static_assert(std::is_integral<CountType>::value,
333 "CountType must be a built-in integer.");
334 static_assert(std::is_integral<SizeType>::value,
335 "SizeType must be a built-in integer.");
337 using device_type =
typename OffsetsViewType::device_type;
338 using execution_space =
typename device_type::execution_space;
340 offset_type total(0);
341 if (ptr.extent(0) != 0) {
342 using CT = CountType;
344 ComputeOffsetsFromConstantCount<offset_type, CT, SizeType>;
345 execution_space execSpace;
346 total = functor_type::run(execSpace, ptr, count);
354 #endif // TPETRA_DETAILS_COMPUTEOFFSETS_HPP
counts_view_type counts_
Bucket counts (input argument).
OffsetsViewType::non_const_value_type computeOffsetsFromConstantCount(const OffsetsViewType &ptr, const CountType count)
Compute offsets from a constant count.
offsets_view_type offsets_
Offsets (output argument)
void deep_copy(MultiVector< DS, DL, DG, DN > &dst, const MultiVector< SS, SL, SG, SN > &src)
Copy the contents of the MultiVector src into dst.
CountType count_
"Count" input argument
SizeType size_
Number of entries in counts_.
OffsetsViewType::non_const_value_type computeOffsetsFromCounts(const ExecutionSpace &execSpace, const OffsetsViewType &ptr, const CountsViewType &counts)
Compute offsets from counts.
Declaration and definition of Tpetra::Details::getEntryOnHost.