16#include "chunk_span.hpp"
17#include "discrete_vector.hpp"
19#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG)
27 static constexpr int const s_threshold = 10;
30 static constexpr int const s_edgeitems = 3;
32 std::stringstream m_ss;
34 static std::ostream& alignment(std::ostream& os,
int level)
36 for (
int i = 0; i <= level; ++i) {
43 std::size_t get_element_width(T
const& elem)
51 void display_aligned_element(std::ostream& os, T
const& elem, std::size_t largest_element)
53 std::size_t
const elem_width = get_element_width(elem);
55 for (std::size_t i = 0; i < largest_element - elem_width; ++i) {
61 template <
class ElementType,
class Extents,
class Layout,
class Accessor>
62 std::ostream& base_case_display(
64 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const& s,
65 std::size_t largest_element,
66 std::size_t beginning,
70 for (std::size_t i0 = beginning; i0 < end; ++i0) {
71 display_aligned_element(os, s[i0], largest_element);
72 if (i0 < extent - 1) {
79 template <
class ElementType,
class Extents,
class Layout,
class Accessor, std::size_t... Is>
80 std::ostream& recursive_display(
82 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const& s,
84 std::size_t largest_element,
85 std::size_t beginning,
87 std::index_sequence<Is...>)
89 for (std::size_t i0 = beginning; i0 < end; ++i0) {
92 Kokkos::submdspan(s, i0, ((
void)Is, Kokkos::full_extent)...),
95 std::make_index_sequence<
sizeof...(Is)>());
97 for (
int ndims = 0; ndims <
sizeof...(Is); ++ndims) {
100 alignment(os, level);
109 template <
class ElementType,
class Extents,
class Layout,
class Accessor>
110 std::ostream& print_impl(
112 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const& s,
115 std::index_sequence<>)
117 return os << *s.data_handle();
128 std::ostream& print_impl(
130 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const& s,
132 std::size_t largest_element,
133 std::index_sequence<I0, Is...>)
135 auto extent = s.extent(I0);
136 if constexpr (
sizeof...(Is) > 0) {
138 if (extent < s_threshold) {
146 std::make_index_sequence<
sizeof...(Is)>());
155 std::make_index_sequence<
sizeof...(Is)>());
156 for (
int ndims = 0; ndims <
sizeof...(Is); ++ndims) {
159 alignment(os, level);
161 for (
int ndims = 0; ndims <
sizeof...(Is); ++ndims) {
164 alignment(os, level);
170 extent - s_edgeitems,
172 std::make_index_sequence<
sizeof...(Is)>());
177 if (extent < s_threshold) {
178 base_case_display(os, s, largest_element, 0, extent, extent);
180 base_case_display(os, s, largest_element, 0, s_edgeitems, extent);
182 base_case_display(os, s, largest_element, extent - s_edgeitems, extent, extent);
191 template <
class ElementType,
class Extents,
class Layout,
class Accessor>
192 std::size_t find_largest_displayed_element(
193 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const&,
194 std::index_sequence<>)
208 std::size_t find_largest_displayed_element(
209 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const& s,
210 std::index_sequence<I0, Is...>)
213 auto extent = s.extent(I0);
214 if constexpr (
sizeof...(Is) > 0) {
215 if (extent < s_threshold) {
216 for (std::size_t i0 = 0; i0 < extent; ++i0) {
219 find_largest_displayed_element(
220 Kokkos::submdspan(s, i0, ((
void)Is, Kokkos::full_extent)...),
221 std::make_index_sequence<
sizeof...(Is)>()));
224 for (std::size_t i0 = 0; i0 < s_edgeitems; ++i0) {
227 find_largest_displayed_element(
228 Kokkos::submdspan(s, i0, ((
void)Is, Kokkos::full_extent)...),
229 std::make_index_sequence<
sizeof...(Is)>()));
231 for (std::size_t i0 = extent - s_edgeitems; i0 < extent; ++i0) {
234 find_largest_displayed_element(
235 Kokkos::submdspan(s, i0, ((
void)Is, Kokkos::full_extent)...),
236 std::make_index_sequence<
sizeof...(Is)>()));
240 if (extent < s_threshold) {
241 for (std::size_t i0 = 0; i0 < extent; ++i0) {
242 ret = std::max(ret, get_element_width(s[i0]));
245 for (std::size_t i0 = 0; i0 < s_edgeitems; ++i0) {
246 ret = std::max(ret, get_element_width(s[i0]));
248 for (std::size_t i0 = extent - s_edgeitems; i0 < extent; ++i0) {
249 ret = std::max(ret, get_element_width(s[i0]));
257 explicit ChunkPrinter(std::ostream
const& os)
263inline void print_demangled_type_name(std::ostream& os,
char const*
const mangled_name)
265#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG)
268 std::unique_ptr<
char,
decltype(std::free)*>
const
269 demangled_name(abi::__cxa_demangle(mangled_name,
nullptr,
nullptr, &status), std::free);
271 os <<
"Error demangling dimension name: " << status;
275 os << demangled_name.get();
281inline void print_single_dim_name(
283 std::type_info
const& dim,
284 DiscreteVectorElement
const size)
286 print_demangled_type_name(os, dim.name());
287 os <<
'(' << size <<
')';
290inline void print_dim_name(std::ostream& os,
DiscreteVector<>
const&)
295template <
class Dim0,
class... Dims>
296void print_dim_name(std::ostream& os,
DiscreteVector<Dim0, Dims...>
const& dd)
298 print_single_dim_name(os,
typeid(Dim0), get<Dim0>(dd));
299 ((os <<
"×", print_single_dim_name(os,
typeid(Dims), get<Dims>(dd))), ...);
304template <
class ElementType,
class SupportType,
class LayoutStridedPolicy,
class MemorySpace>
307 ChunkSpan<ElementType, SupportType, LayoutStridedPolicy, MemorySpace>
const& chunk_span)
309 auto h_chunk_span = create_mirror_view_and_copy(Kokkos::HostSpace(), chunk_span);
311 using chunkspan_type = std::remove_cv_t<std::remove_reference_t<
decltype(h_chunk_span)>>;
312 using mdspan_type =
typename chunkspan_type::allocation_mdspan_type;
313 using extents =
typename mdspan_type::extents_type;
315 mdspan_type
const allocated_mdspan = h_chunk_span.allocation_mdspan();
317 ddc::detail::ChunkPrinter printer(os);
318 std::size_t
const largest_element = printer.find_largest_displayed_element(
320 std::make_index_sequence<extents::rank()>());
327 std::make_index_sequence<extents::rank()>());
332template <
class ElementType,
class SupportType,
class LayoutStridedPolicy,
class MemorySpace>
335 ChunkSpan<ElementType, SupportType, LayoutStridedPolicy, MemorySpace>
const& chunk_span)
337 ddc::detail::print_dim_name(os, chunk_span.extents());
339 ddc::detail::print_demangled_type_name(os,
typeid(chunk_span).name());
345template <
class ElementType,
class SupportType,
class LayoutStridedPolicy,
class MemorySpace>
348 ChunkSpan<ElementType, SupportType, LayoutStridedPolicy, MemorySpace>
const& chunk_span)
350 print_type_info(os, chunk_span);
351 print_content(os, chunk_span);
357template <
class ElementType,
class SupportType,
class LayoutStridedPolicy,
class MemorySpace>
358std::ostream& operator<<(
360 ChunkSpan<ElementType, SupportType, LayoutStridedPolicy, MemorySpace>
const& chunk_span)
362 return print(os, chunk_span);
KOKKOS_FUNCTION constexpr bool operator!=(DiscreteVector< OTags... > const &rhs) const noexcept
The top-level namespace of DDC.
std::ostream & print_content(std::ostream &os, ChunkSpan< ElementType, SupportType, LayoutStridedPolicy, MemorySpace > const &chunk_span)
std::ostream & print(std::ostream &os, ChunkSpan< ElementType, SupportType, LayoutStridedPolicy, MemorySpace > const &chunk_span)
std::ostream & print_type_info(std::ostream &os, ChunkSpan< ElementType, SupportType, LayoutStridedPolicy, MemorySpace > const &chunk_span)