42 #ifndef TPETRA_DETAILS_COMPUTEOFFSETS_HPP
43 #define TPETRA_DETAILS_COMPUTEOFFSETS_HPP
52 #include "TpetraCore_config.h"
55 #include <type_traits>
75 template<
class OffsetType,
78 class ComputeOffsetsFromCounts {
80 static_assert (std::is_integral<OffsetType>::value,
81 "OffsetType must be a built-in integer.");
82 static_assert (std::is_integral<CountType>::value,
83 "CountType must be a built-in integer.");
84 static_assert (std::is_integral<SizeType>::value,
85 "SizeType must be a built-in integer.");
87 using offsets_view_type =
88 Kokkos::View<OffsetType*, Kokkos::AnonymousSpace>;
89 using counts_view_type =
90 Kokkos::View<const CountType*, Kokkos::AnonymousSpace>;
97 ComputeOffsetsFromCounts (
const offsets_view_type& offsets,
98 const counts_view_type& counts) :
101 size_ (counts.extent (0))
105 KOKKOS_INLINE_FUNCTION
void
106 operator () (
const SizeType i, OffsetType& update,
107 const bool finalPass)
const
109 const auto curVal = (i <
size_) ?
counts_[i] : OffsetType ();
113 update += (i <
size_) ? curVal : OffsetType ();
116 template<
class ExecutionSpace>
118 run (
const ExecutionSpace& execSpace,
119 const offsets_view_type& offsets,
120 const counts_view_type& counts)
122 const SizeType numCounts (counts.extent (0));
123 using range_type = Kokkos::RangePolicy<ExecutionSpace, SizeType>;
124 range_type range (execSpace, 0, numCounts + SizeType (1));
126 ComputeOffsetsFromCounts<OffsetType, CountType, SizeType>;
127 functor_type functor (offsets, counts);
128 OffsetType total (0);
129 const char funcName[] =
"Tpetra::Details::computeOffsetsFromCounts";
130 Kokkos::parallel_scan (funcName, range, functor, total);
152 template<
class OffsetType,
155 class ComputeOffsetsFromConstantCount {
157 static_assert (std::is_integral<OffsetType>::value,
158 "OffsetType must be a built-in integer.");
159 static_assert (std::is_integral<CountType>::value,
160 "CountType must be a built-in integer.");
161 static_assert (std::is_integral<SizeType>::value,
162 "SizeType must be a built-in integer.");
164 using offsets_view_type =
165 Kokkos::View<OffsetType*, Kokkos::AnonymousSpace>;
172 ComputeOffsetsFromConstantCount (
const offsets_view_type& offsets,
173 const CountType count) :
179 KOKKOS_INLINE_FUNCTION
void
180 operator () (
const SizeType i)
const
185 template<
class ExecutionSpace>
187 run (
const ExecutionSpace& execSpace,
188 const offsets_view_type& offsets,
189 const CountType count)
191 const SizeType numOffsets (offsets.extent (0));
192 if(numOffsets == SizeType(0))
197 using range_type = Kokkos::RangePolicy<ExecutionSpace, SizeType>;
198 range_type range (execSpace, 0, numOffsets);
200 ComputeOffsetsFromConstantCount<OffsetType, CountType, SizeType>;
201 functor_type functor (offsets, count);
202 const OffsetType total = (numOffsets - 1) * count;
203 const char funcName[] =
204 "Tpetra::Details::computeOffsetsFromConstantCount";
205 Kokkos::parallel_for (funcName, range, functor);
243 template<
class ExecutionSpace,
244 class OffsetsViewType,
245 class CountsViewType,
246 class SizeType =
typename OffsetsViewType::size_type>
247 typename OffsetsViewType::non_const_value_type
249 const OffsetsViewType& ptr,
250 const CountsViewType& counts)
252 static_assert (Kokkos::is_execution_space<ExecutionSpace>::value,
253 "ExecutionSpace must be a Kokkos execution space.");
254 static_assert (Kokkos::is_view<OffsetsViewType>::value,
255 "OffsetsViewType (the type of ptr) must be a Kokkos::View.");
256 static_assert (Kokkos::is_view<CountsViewType>::value,
257 "CountsViewType (the type of counts) must be a Kokkos::View.");
258 static_assert (std::is_same<
typename OffsetsViewType::value_type,
259 typename OffsetsViewType::non_const_value_type>::value,
260 "OffsetsViewType (the type of ptr) must be a nonconst Kokkos::View.");
261 static_assert (static_cast<int> (OffsetsViewType::rank) == 1,
262 "OffsetsViewType (the type of ptr) must be a rank-1 Kokkos::View.");
263 static_assert (static_cast<int> (CountsViewType::rank) == 1,
264 "CountsViewType (the type of counts) must be a rank-1 Kokkos::View.");
266 using offset_type =
typename OffsetsViewType::non_const_value_type;
267 static_assert (std::is_integral<offset_type>::value,
268 "The entries of ptr must be built-in integers.");
269 using count_type =
typename CountsViewType::non_const_value_type;
270 static_assert (std::is_integral<count_type>::value,
271 "The entries of counts must be built-in integers.");
272 static_assert (std::is_integral<SizeType>::value,
273 "SizeType must be a built-in integer type.");
275 const char funcName[] =
"Tpetra::Details::computeOffsetsFromCounts";
277 const auto numOffsets = ptr.size ();
278 const auto numCounts = counts.size ();
279 offset_type total (0);
281 if (numOffsets != 0) {
282 TEUCHOS_TEST_FOR_EXCEPTION
283 (numCounts >= numOffsets, std::invalid_argument, funcName <<
284 ": counts.size() = " << numCounts <<
" >= ptr.size() = " <<
287 using Kokkos::AnonymousSpace;
289 View<offset_type*, AnonymousSpace> ptr_a = ptr;
290 View<const count_type*, AnonymousSpace> counts_a;
292 using offsets_device_type =
typename OffsetsViewType::device_type;
293 using counts_copy_type = View<count_type*, offsets_device_type>;
294 counts_copy_type counts_copy;
296 using offsets_memory_space =
297 typename offsets_device_type::memory_space;
298 using counts_memory_space =
typename CountsViewType::memory_space;
299 constexpr
bool countsAccessibleFromOffsetsExecSpace =
300 Kokkos::SpaceAccessibility<
301 offsets_memory_space, counts_memory_space>::accessible;
302 if (countsAccessibleFromOffsetsExecSpace) {
310 using Kokkos::view_alloc;
311 using Kokkos::WithoutInitializing;
312 counts_copy = counts_copy_type
313 (view_alloc (
"counts_copy", WithoutInitializing), numCounts);
315 counts_a = counts_copy;
319 ComputeOffsetsFromCounts<offset_type, count_type, SizeType>;
320 total = functor_type::run (execSpace, ptr_a, counts_a);
327 template<
class OffsetsViewType,
328 class CountsViewType,
329 class SizeType =
typename OffsetsViewType::size_type>
330 typename OffsetsViewType::non_const_value_type
332 const CountsViewType& counts)
334 using execution_space =
typename OffsetsViewType::execution_space;
360 template<
class OffsetsViewType,
362 class SizeType =
typename OffsetsViewType::size_type>
363 typename OffsetsViewType::non_const_value_type
365 const CountType count)
367 static_assert (Kokkos::is_view<OffsetsViewType>::value,
368 "ptr must be a Kokkos::View.");
369 static_assert (std::is_same<
typename OffsetsViewType::value_type,
370 typename OffsetsViewType::non_const_value_type>::value,
371 "ptr must be a nonconst Kokkos::View.");
372 static_assert (static_cast<int> (OffsetsViewType::rank) == 1,
373 "ptr must be a rank-1 Kokkos::View.");
375 using offset_type =
typename OffsetsViewType::non_const_value_type;
376 static_assert (std::is_integral<offset_type>::value,
377 "The type of each entry of ptr must be a "
378 "built-in integer.");
379 static_assert (std::is_integral<CountType>::value,
380 "CountType must be a built-in integer.");
381 static_assert (std::is_integral<SizeType>::value,
382 "SizeType must be a built-in integer.");
384 using device_type =
typename OffsetsViewType::device_type;
385 using execution_space =
typename device_type::execution_space;
387 offset_type total (0);
388 if (ptr.extent (0) != 0) {
389 using CT = CountType;
391 ComputeOffsetsFromConstantCount<offset_type, CT, SizeType>;
392 execution_space execSpace;
393 total = functor_type::run (execSpace, ptr, count);
401 #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.