15#include "ddc/chunk_span.hpp"
16#include "ddc/discrete_domain.hpp"
18#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG)
26 static constexpr int const s_threshold = 10;
29 static constexpr int const s_edgeitems = 3;
31 std::stringstream m_ss;
33 static std::ostream& alignment(std::ostream& os,
int level)
35 for (
int i = 0; i <= level; ++i) {
42 std::size_t get_element_width(T
const& elem)
50 void display_aligned_element(std::ostream& os, T
const& elem, std::size_t largest_element)
52 std::size_t
const elem_width = get_element_width(elem);
54 for (std::size_t i = 0; i < largest_element - elem_width; ++i) {
60 template <
class ElementType,
class Extents,
class Layout,
class Accessor>
61 std::ostream& base_case_display(
63 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const& s,
64 std::size_t largest_element,
65 std::size_t beginning,
69 for (std::size_t i0 = beginning; i0 < end; ++i0) {
70 display_aligned_element(os, s[i0], largest_element);
71 if (i0 < extent - 1) {
78 template <
class ElementType,
class Extents,
class Layout,
class Accessor, std::size_t... Is>
79 std::ostream& recursive_display(
81 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const& s,
83 std::size_t largest_element,
84 std::size_t beginning,
86 std::index_sequence<Is...>)
88 for (std::size_t i0 = beginning; i0 < end; ++i0) {
91 Kokkos::submdspan(s, i0, ((
void)Is, Kokkos::full_extent)...),
94 std::make_index_sequence<
sizeof...(Is)>());
96 for (
int ndims = 0; ndims <
sizeof...(Is); ++ndims) {
108 template <
class ElementType,
class Extents,
class Layout,
class Accessor>
109 std::ostream& print_impl(
111 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const& s,
114 std::index_sequence<>)
116 return os << *s.data_handle();
127 std::ostream& print_impl(
129 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const& s,
131 std::size_t largest_element,
132 std::index_sequence<I0, Is...>)
134 auto extent = s.extent(I0);
135 if constexpr (
sizeof...(Is) > 0) {
137 if (extent < s_threshold) {
145 std::make_index_sequence<
sizeof...(Is)>());
154 std::make_index_sequence<
sizeof...(Is)>());
155 for (
int ndims = 0; ndims <
sizeof...(Is); ++ndims) {
158 alignment(os, level);
160 for (
int ndims = 0; ndims <
sizeof...(Is); ++ndims) {
163 alignment(os, level);
169 extent - s_edgeitems,
171 std::make_index_sequence<
sizeof...(Is)>());
176 if (extent < s_threshold) {
177 base_case_display(os, s, largest_element, 0, extent, extent);
179 base_case_display(os, s, largest_element, 0, s_edgeitems, extent);
181 base_case_display(os, s, largest_element, extent - s_edgeitems, extent, extent);
190 template <
class ElementType,
class Extents,
class Layout,
class Accessor>
191 std::size_t find_largest_displayed_element(
192 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const&,
193 std::index_sequence<>)
207 std::size_t find_largest_displayed_element(
208 Kokkos::mdspan<ElementType, Extents, Layout, Accessor>
const& s,
209 std::index_sequence<I0, Is...>)
212 auto extent = s.extent(I0);
213 if constexpr (
sizeof...(Is) > 0) {
214 if (extent < s_threshold) {
215 for (std::size_t i0 = 0; i0 < extent; ++i0) {
218 find_largest_displayed_element(
219 Kokkos::submdspan(s, i0, ((
void)Is, Kokkos::full_extent)...),
220 std::make_index_sequence<
sizeof...(Is)>()));
223 for (std::size_t i0 = 0; i0 < s_edgeitems; ++i0) {
226 find_largest_displayed_element(
227 Kokkos::submdspan(s, i0, ((
void)Is, Kokkos::full_extent)...),
228 std::make_index_sequence<
sizeof...(Is)>()));
230 for (std::size_t i0 = extent - s_edgeitems; i0 < extent; ++i0) {
233 find_largest_displayed_element(
234 Kokkos::submdspan(s, i0, ((
void)Is, Kokkos::full_extent)...),
235 std::make_index_sequence<
sizeof...(Is)>()));
239 if (extent < s_threshold) {
240 for (std::size_t i0 = 0; i0 < extent; ++i0) {
241 ret = std::max(ret, get_element_width(s[i0]));
244 for (std::size_t i0 = 0; i0 < s_edgeitems; ++i0) {
245 ret = std::max(ret, get_element_width(s[i0]));
247 for (std::size_t i0 = extent - s_edgeitems; i0 < extent; ++i0) {
248 ret = std::max(ret, get_element_width(s[i0]));
256 explicit ChunkPrinter(std::ostream
const& os)
262#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG)
264void print_demangled_type_name(std::ostream& os)
268 std::unique_ptr<
char,
decltype(std::free)*>
const demangled_name(
269 abi::__cxa_demangle(
typeid(Type).name(),
nullptr,
nullptr, &status),
272 os <<
"Error demangling dimension name: " << status;
276 os << demangled_name.get();
280void print_demangled_type_name(std::ostream& os)
282 os <<
typeid(Type).name();
286inline void print_dim_name(std::ostream& os,
DiscreteDomain<>
const)
292void print_dim_name(std::ostream& os,
DiscreteDomain<Dim>
const dd)
294 print_demangled_type_name<Dim>(os);
295 os <<
'(' << dd.size() <<
')';
298template <
class Dim0,
class Dim1,
class... Dims>
299void print_dim_name(std::ostream& os,
DiscreteDomain<Dim0, Dim1, Dims...>
const dd)
301 print_demangled_type_name<Dim0>(os);
303 os <<
'(' << dd.size() / smaller_dd.size() <<
")×";
304 print_dim_name(os, smaller_dd);
309template <
class ElementType,
class SupportType,
class LayoutStridedPolicy,
class MemorySpace>
312 ChunkSpan<ElementType, SupportType, LayoutStridedPolicy, MemorySpace>
const& chunk_span)
314 auto h_chunk_span = create_mirror_view_and_copy(Kokkos::HostSpace(), chunk_span);
316 using chunkspan_type = std::remove_cv_t<std::remove_reference_t<
decltype(h_chunk_span)>>;
317 using mdspan_type =
typename chunkspan_type::allocation_mdspan_type;
318 using extents =
typename mdspan_type::extents_type;
320 mdspan_type
const allocated_mdspan = h_chunk_span.allocation_mdspan();
322 ddc::detail::ChunkPrinter printer(os);
323 std::size_t
const largest_element = printer.find_largest_displayed_element(
325 std::make_index_sequence<extents::rank()>());
332 std::make_index_sequence<extents::rank()>());
337template <
class ElementType,
class SupportType,
class LayoutStridedPolicy,
class MemorySpace>
340 ChunkSpan<ElementType, SupportType, LayoutStridedPolicy, MemorySpace>
const& chunk_span)
342 ddc::detail::print_dim_name(os, chunk_span.domain());
344 ddc::detail::print_demangled_type_name<
decltype(chunk_span)>(os);
350template <
class ElementType,
class SupportType,
class LayoutStridedPolicy,
class MemorySpace>
353 ChunkSpan<ElementType, SupportType, LayoutStridedPolicy, MemorySpace>
const& chunk_span)
355 print_type_info(os, chunk_span);
356 print_content(os, chunk_span);
362template <
class ElementType,
class SupportType,
class LayoutStridedPolicy,
class MemorySpace>
363std::ostream& operator<<(
365 ChunkSpan<ElementType, SupportType, LayoutStridedPolicy, MemorySpace>
const& chunk_span)
367 return print(os, chunk_span);
friend class DiscreteDomain
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)