From 85975975fd99d60516910c18df3cf317e8612c69 Mon Sep 17 00:00:00 2001 From: Thomas Padioleau Date: Sat, 7 Feb 2026 12:03:56 +0100 Subject: [PATCH 1/2] Remove header-only libraries --- CMakeLists.txt | 59 +++++++++++---- src/ddc/discrete_element.cpp | 27 +++++++ src/ddc/discrete_element.hpp | 24 +++---- src/ddc/discrete_space.cpp | 71 +++++++++++++++++++ src/ddc/discrete_space.hpp | 44 ++---------- src/ddc/discrete_vector.cpp | 27 +++++++ src/ddc/discrete_vector.hpp | 24 +++---- src/ddc/kernels/fft.cpp | 36 ++++++++++ src/ddc/kernels/fft.hpp | 24 +------ .../splines/spline_boundary_conditions.cpp | 29 ++++++++ .../splines/spline_boundary_conditions.hpp | 24 ++----- src/ddc/pdi.cpp | 35 +++++++++ src/ddc/pdi.hpp | 20 ++---- src/ddc/print.cpp | 64 +++++++++++++++++ src/ddc/print.hpp | 48 +++---------- 15 files changed, 382 insertions(+), 174 deletions(-) create mode 100644 src/ddc/discrete_element.cpp create mode 100644 src/ddc/discrete_space.cpp create mode 100644 src/ddc/discrete_vector.cpp create mode 100644 src/ddc/kernels/fft.cpp create mode 100644 src/ddc/kernels/splines/spline_boundary_conditions.cpp create mode 100644 src/ddc/pdi.cpp create mode 100644 src/ddc/print.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0fc6a789b..c7833fa71 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -123,13 +123,18 @@ endif() ## The library itself -add_library(ddc_core INTERFACE) +add_library(ddc_core) add_library(DDC::core ALIAS ddc_core) configure_file(cmake/config.hpp.in generated/ddc/config.hpp NO_SOURCE_PERMISSIONS @ONLY) -target_compile_features(ddc_core INTERFACE cxx_std_17) -target_link_libraries(ddc_core INTERFACE Kokkos::kokkos) +target_compile_features(ddc_core PUBLIC cxx_std_17) +target_link_libraries(ddc_core PUBLIC Kokkos::kokkos) target_sources( ddc_core + PRIVATE + src/ddc/discrete_space.cpp + src/ddc/discrete_element.cpp + src/ddc/discrete_vector.cpp + src/ddc/print.cpp INTERFACE FILE_SET HEADERS BASE_DIRS src ${CMAKE_CURRENT_BINARY_DIR}/generated @@ -212,13 +217,22 @@ if("${DDC_BUILD_KERNELS_FFT}") endif() endif() - add_library(ddc_fft INTERFACE) + add_library(ddc_fft) add_library(DDC::fft ALIAS ddc_fft) - target_compile_features(ddc_fft INTERFACE cxx_std_17) - target_link_libraries(ddc_fft INTERFACE DDC::core Kokkos::kokkos KokkosFFT::fft) - target_sources(ddc_fft INTERFACE FILE_SET HEADERS BASE_DIRS src FILES src/ddc/kernels/fft.hpp) + target_compile_features(ddc_fft PUBLIC cxx_std_17) + target_link_libraries(ddc_fft PUBLIC DDC::core Kokkos::kokkos KokkosFFT::fft) + target_sources( + ddc_fft + INTERFACE FILE_SET HEADERS BASE_DIRS src FILES src/ddc/kernels/fft.hpp + PRIVATE src/ddc/kernels/fft.cpp + ) - set_target_properties(ddc_fft PROPERTIES EXPORT_NAME fft) + set_target_properties( + ddc_fft + PROPERTIES + EXPORT_NAME fft + INSTALL_RPATH "$<$:$ORIGIN>;$<$:@loader_path>" + ) install(TARGETS ddc_fft EXPORT DDCFftTargets FILE_SET HEADERS) install(EXPORT DDCFftTargets NAMESPACE DDC:: DESTINATION ${DDC_INSTALL_CMAKEDIR}) endif() @@ -258,13 +272,14 @@ if("${DDC_BUILD_KERNELS_SPLINES}") target_compile_features(ddc_splines INTERFACE cxx_std_17) target_link_libraries( ddc_splines + INTERFACE DDC::core PRIVATE Ginkgo::ginkgo Kokkos::kokkoskernels LAPACKE::LAPACKE PUBLIC Kokkos::kokkos - INTERFACE DDC::core ) target_sources( ddc_splines PRIVATE + src/ddc/kernels/splines/spline_boundary_conditions.cpp src/ddc/kernels/splines/splines_linear_problem.cpp src/ddc/kernels/splines/splines_linear_problem_2x2_blocks.cpp src/ddc/kernels/splines/splines_linear_problem_3x3_blocks.cpp @@ -310,7 +325,12 @@ if("${DDC_BUILD_KERNELS_SPLINES}") ) install(FILES cmake/FindLAPACKE.cmake DESTINATION ${DDC_INSTALL_CMAKEDIR}) - set_target_properties(ddc_splines PROPERTIES EXPORT_NAME splines) + set_target_properties( + ddc_splines + PROPERTIES + EXPORT_NAME splines + INSTALL_RPATH "$<$:$ORIGIN>;$<$:@loader_path>" + ) install(TARGETS ddc_splines EXPORT DDCSplinesTargets FILE_SET HEADERS) install(EXPORT DDCSplinesTargets NAMESPACE DDC:: DESTINATION ${DDC_INSTALL_CMAKEDIR}) endif() @@ -320,13 +340,22 @@ endif() if("${DDC_BUILD_PDI_WRAPPER}") find_package(PDI 1.10.1...<2 REQUIRED COMPONENTS C) - add_library(ddc_pdi INTERFACE) + add_library(ddc_pdi) add_library(DDC::pdi ALIAS ddc_pdi) - target_compile_features(ddc_pdi INTERFACE cxx_std_17) - target_link_libraries(ddc_pdi INTERFACE DDC::core PDI::PDI_C) - target_sources(ddc_pdi INTERFACE FILE_SET HEADERS BASE_DIRS src FILES src/ddc/pdi.hpp) + target_compile_features(ddc_pdi PUBLIC cxx_std_17) + target_link_libraries(ddc_pdi PUBLIC DDC::core PDI::PDI_C) + target_sources( + ddc_pdi + INTERFACE FILE_SET HEADERS BASE_DIRS src FILES src/ddc/pdi.hpp + PRIVATE src/ddc/pdi.cpp + ) - set_target_properties(ddc_pdi PROPERTIES EXPORT_NAME pdi) + set_target_properties( + ddc_pdi + PROPERTIES + EXPORT_NAME pdi + INSTALL_RPATH "$<$:$ORIGIN>;$<$:@loader_path>" + ) install(TARGETS ddc_pdi EXPORT DDCPdiTargets FILE_SET HEADERS) install(EXPORT DDCPdiTargets NAMESPACE DDC:: DESTINATION ${DDC_INSTALL_CMAKEDIR}) endif() diff --git a/src/ddc/discrete_element.cpp b/src/ddc/discrete_element.cpp new file mode 100644 index 000000000..7395cc6d0 --- /dev/null +++ b/src/ddc/discrete_element.cpp @@ -0,0 +1,27 @@ +// Copyright (C) The DDC development team, see COPYRIGHT.md file +// +// SPDX-License-Identifier: MIT + +#include +#include + +#include "discrete_element.hpp" + +namespace ddc::detail { + +void print_discrete_element( + std::ostream& os, + DiscreteElementType const* const data, + std::size_t const n) +{ + os << '('; + if (n > 0) { + os << data[0]; + for (std::size_t i = 1; i < n; ++i) { + os << ", " << data[i]; + } + } + os << ')'; +} + +} // namespace ddc::detail diff --git a/src/ddc/discrete_element.hpp b/src/ddc/discrete_element.hpp index bc4a872ef..3406ece51 100644 --- a/src/ddc/discrete_element.hpp +++ b/src/ddc/discrete_element.hpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include @@ -317,20 +317,18 @@ class DiscreteElement } }; -inline std::ostream& operator<<(std::ostream& out, DiscreteElement<> const&) -{ - out << "()"; - return out; -} +namespace detail { + +void print_discrete_element(std::ostream& os, DiscreteElementType const* data, std::size_t n); -template -std::ostream& operator<<(std::ostream& out, DiscreteElement const& arr) +} // namespace detail + +template +std::ostream& operator<<(std::ostream& os, DiscreteElement const& arr) { - out << "("; - out << uid(arr); - ((out << ", " << uid(arr)), ...); - out << ")"; - return out; + std::array const std_arr = detail::array(arr); + detail::print_discrete_element(os, std_arr.data(), std_arr.size()); + return os; } diff --git a/src/ddc/discrete_space.cpp b/src/ddc/discrete_space.cpp new file mode 100644 index 000000000..20e41da88 --- /dev/null +++ b/src/ddc/discrete_space.cpp @@ -0,0 +1,71 @@ +// Copyright (C) The DDC development team, see COPYRIGHT.md file +// +// SPDX-License-Identifier: MIT + +#include +#include +#include +#include +#include +#include + +#include + +#if defined(KOKKOS_ENABLE_CUDA) +# include + +# include +#elif defined(KOKKOS_ENABLE_HIP) +# include + +# include +#endif + +namespace ddc::detail { + +#if defined(KOKKOS_ENABLE_CUDA) +void device_throw_on_error( + cudaError_t const err, + const char* const func, + const char* const file, + const int line) +{ + if (err != cudaSuccess) { + std::stringstream ss; + ss << "CUDA Runtime Error at: " << file << ":" << line << "\n"; + ss << cudaGetErrorString(err) << " " << func << "\n"; + throw std::runtime_error(ss.str()); + } +} +#elif defined(KOKKOS_ENABLE_HIP) +void device_throw_on_error( + hipError_t const err, + const char* const func, + const char* const file, + const int line) +{ + if (err != hipSuccess) { + std::stringstream ss; + ss << "HIP Runtime Error at: " << file << ":" << line << "\n"; + ss << hipGetErrorString(err) << " " << func << "\n"; + throw std::runtime_error(ss.str()); + } +} +#endif + +// Global CPU variable storing resetters. Required to correctly free data. +std::optional>> g_discretization_store; + +void display_discretization_store(std::ostream& os) +{ + if (g_discretization_store) { + os << "The host discretization store is initialized:\n"; + for (auto const& [key, value] : *g_discretization_store) { + os << " - " << key << "\n"; + } + } else { + os << "The host discretization store is not initialized:\n"; + } +} + +} // namespace ddc::detail diff --git a/src/ddc/discrete_space.hpp b/src/ddc/discrete_space.hpp index d64bfb3e7..c21608ac1 100644 --- a/src/ddc/discrete_space.hpp +++ b/src/ddc/discrete_space.hpp @@ -7,9 +7,9 @@ #include #include #include +#include #include #include -#include #include #include #include @@ -23,12 +23,8 @@ #include "detail/macros.hpp" #if defined(KOKKOS_ENABLE_CUDA) -# include - # include #elif defined(KOKKOS_ENABLE_HIP) -# include - # include #endif @@ -42,33 +38,17 @@ namespace ddc { namespace detail { #if defined(KOKKOS_ENABLE_CUDA) -inline void device_throw_on_error( +void device_throw_on_error( cudaError_t const err, const char* const func, const char* const file, - const int line) -{ - if (err != cudaSuccess) { - std::stringstream ss; - ss << "CUDA Runtime Error at: " << file << ":" << line << "\n"; - ss << cudaGetErrorString(err) << " " << func << "\n"; - throw std::runtime_error(ss.str()); - } -} + const int line); #elif defined(KOKKOS_ENABLE_HIP) -inline void device_throw_on_error( +void device_throw_on_error( hipError_t const err, const char* const func, const char* const file, - const int line) -{ - if (err != hipSuccess) { - std::stringstream ss; - ss << "HIP Runtime Error at: " << file << ":" << line << "\n"; - ss << hipGetErrorString(err) << " " << func << "\n"; - throw std::runtime_error(ss.str()); - } -} + const int line); #endif template @@ -111,7 +91,7 @@ class GpuProxy }; // Global CPU variable storing resetters. Required to correctly free data. -inline std::optional>> g_discretization_store; +extern std::optional>> g_discretization_store; // Global CPU variable owning discrete spaces data for CPU and GPU template @@ -134,17 +114,7 @@ SYCL_EXTERNAL inline sycl::ext::oneapi::experimental::device_global< g_discrete_space_device; #endif -inline void display_discretization_store(std::ostream& os) -{ - if (g_discretization_store) { - os << "The host discretization store is initialized:\n"; - for (auto const& [key, value] : *g_discretization_store) { - os << " - " << key << "\n"; - } - } else { - os << "The host discretization store is not initialized:\n"; - } -} +void display_discretization_store(std::ostream& os); template auto extract_after(Tuple&& t, std::index_sequence) diff --git a/src/ddc/discrete_vector.cpp b/src/ddc/discrete_vector.cpp new file mode 100644 index 000000000..b675b40d0 --- /dev/null +++ b/src/ddc/discrete_vector.cpp @@ -0,0 +1,27 @@ +// Copyright (C) The DDC development team, see COPYRIGHT.md file +// +// SPDX-License-Identifier: MIT + +#include +#include + +#include "discrete_vector.hpp" + +namespace ddc::detail { + +void print_discrete_vector( + std::ostream& os, + DiscreteVectorElement const* const data, + std::size_t const n) +{ + os << '('; + if (n > 0) { + os << data[0]; + for (std::size_t i = 1; i < n; ++i) { + os << ", " << data[i]; + } + } + os << ')'; +} + +} // namespace ddc::detail diff --git a/src/ddc/discrete_vector.hpp b/src/ddc/discrete_vector.hpp index 24e3fa238..7b72502e4 100644 --- a/src/ddc/discrete_vector.hpp +++ b/src/ddc/discrete_vector.hpp @@ -6,7 +6,7 @@ #include #include -#include +#include #include #include @@ -474,20 +474,18 @@ KOKKOS_FUNCTION constexpr bool operator<(DiscreteVector const& lhs, Integra return lhs.value() < rhs; } -inline std::ostream& operator<<(std::ostream& out, DiscreteVector<> const&) -{ - out << "()"; - return out; -} +namespace detail { + +void print_discrete_vector(std::ostream& os, DiscreteVectorElement const* data, std::size_t n); -template -std::ostream& operator<<(std::ostream& out, DiscreteVector const& arr) +} // namespace detail + +template +std::ostream& operator<<(std::ostream& os, DiscreteVector const& arr) { - out << "("; - out << get(arr); - ((out << ", " << get(arr)), ...); - out << ")"; - return out; + std::array const std_arr = detail::array(arr); + detail::print_discrete_vector(os, std_arr.data(), std_arr.size()); + return os; } } // namespace ddc diff --git a/src/ddc/kernels/fft.cpp b/src/ddc/kernels/fft.cpp new file mode 100644 index 000000000..2a6bfba0c --- /dev/null +++ b/src/ddc/kernels/fft.cpp @@ -0,0 +1,36 @@ +// Copyright (C) The DDC development team, see COPYRIGHT.md file +// +// SPDX-License-Identifier: MIT + +#include + +#include + +#include "fft.hpp" + +namespace ddc::detail::fft { + +KokkosFFT::Normalization ddc_fft_normalization_to_kokkos_fft( + FFT_Normalization const ddc_fft_normalization) +{ + if (ddc_fft_normalization == ddc::FFT_Normalization::OFF + || ddc_fft_normalization == ddc::FFT_Normalization::FULL) { + return KokkosFFT::Normalization::none; + } + + if (ddc_fft_normalization == ddc::FFT_Normalization::FORWARD) { + return KokkosFFT::Normalization::forward; + } + + if (ddc_fft_normalization == ddc::FFT_Normalization::BACKWARD) { + return KokkosFFT::Normalization::backward; + } + + if (ddc_fft_normalization == ddc::FFT_Normalization::ORTHO) { + return KokkosFFT::Normalization::ortho; + } + + throw std::runtime_error("ddc::FFT_Normalization not handled"); +} + +} // namespace ddc::detail::fft diff --git a/src/ddc/kernels/fft.hpp b/src/ddc/kernels/fft.hpp index c683e319c..2a9fa69e6 100644 --- a/src/ddc/kernels/fft.hpp +++ b/src/ddc/kernels/fft.hpp @@ -103,28 +103,8 @@ KokkosFFT::axis_type axes() static_cast(ddc::type_seq_rank_v>)...}; } -inline KokkosFFT::Normalization ddc_fft_normalization_to_kokkos_fft( - FFT_Normalization const ddc_fft_normalization) -{ - if (ddc_fft_normalization == ddc::FFT_Normalization::OFF - || ddc_fft_normalization == ddc::FFT_Normalization::FULL) { - return KokkosFFT::Normalization::none; - } - - if (ddc_fft_normalization == ddc::FFT_Normalization::FORWARD) { - return KokkosFFT::Normalization::forward; - } - - if (ddc_fft_normalization == ddc::FFT_Normalization::BACKWARD) { - return KokkosFFT::Normalization::backward; - } - - if (ddc_fft_normalization == ddc::FFT_Normalization::ORTHO) { - return KokkosFFT::Normalization::ortho; - } - - throw std::runtime_error("ddc::FFT_Normalization not handled"); -} +KokkosFFT::Normalization ddc_fft_normalization_to_kokkos_fft( + FFT_Normalization ddc_fft_normalization); template class ScaleFn diff --git a/src/ddc/kernels/splines/spline_boundary_conditions.cpp b/src/ddc/kernels/splines/spline_boundary_conditions.cpp new file mode 100644 index 000000000..aa4f01cfb --- /dev/null +++ b/src/ddc/kernels/splines/spline_boundary_conditions.cpp @@ -0,0 +1,29 @@ +// Copyright (C) The DDC development team, see COPYRIGHT.md file +// +// SPDX-License-Identifier: MIT + +#include +#include + +#include "spline_boundary_conditions.hpp" + +namespace ddc { + +std::ostream& operator<<(std::ostream& os, ddc::BoundCond const bc) +{ + if (bc == ddc::BoundCond::PERIODIC) { + return os << "PERIODIC"; + } + + if (bc == ddc::BoundCond::HERMITE) { + return os << "HERMITE"; + } + + if (bc == ddc::BoundCond::GREVILLE) { + return os << "GREVILLE"; + } + + throw std::runtime_error("ddc::BoundCond not handled"); +} + +} // namespace ddc diff --git a/src/ddc/kernels/splines/spline_boundary_conditions.hpp b/src/ddc/kernels/splines/spline_boundary_conditions.hpp index b542db1cd..46ee7666a 100644 --- a/src/ddc/kernels/splines/spline_boundary_conditions.hpp +++ b/src/ddc/kernels/splines/spline_boundary_conditions.hpp @@ -4,8 +4,7 @@ #pragma once -#include -#include +#include #include namespace ddc { @@ -22,27 +21,12 @@ enum class BoundCond { /** * @brief Prints a boundary condition in a std::ostream. * - * @param out The stream in which the boundary condition is printed. - * @param degree The boundary condition. + * @param os The stream in which the boundary condition is printed. + * @param bc The boundary condition. * * @return The stream in which the boundary condition is printed. **/ -static inline std::ostream& operator<<(std::ostream& out, ddc::BoundCond const bc) -{ - if (bc == ddc::BoundCond::PERIODIC) { - return out << "PERIODIC"; - } - - if (bc == ddc::BoundCond::HERMITE) { - return out << "HERMITE"; - } - - if (bc == ddc::BoundCond::GREVILLE) { - return out << "GREVILLE"; - } - - throw std::runtime_error("ddc::BoundCond not handled"); -} +std::ostream& operator<<(std::ostream& os, ddc::BoundCond bc); /** * @brief Return the number of equations needed to describe a given boundary condition. diff --git a/src/ddc/pdi.cpp b/src/ddc/pdi.cpp new file mode 100644 index 000000000..a4375376f --- /dev/null +++ b/src/ddc/pdi.cpp @@ -0,0 +1,35 @@ +// Copyright (C) The DDC development team, see COPYRIGHT.md file +// +// SPDX-License-Identifier: MIT + +#include +#include +#include + +#include + +#include "pdi.hpp" + +namespace ddc { + +char const* PdiEvent::store_name(std::string&& name) +{ + return m_names.emplace_back(std::move(name)).c_str(); +} + +char const* PdiEvent::store_name(std::string const& name) +{ + return m_names.emplace_back(name).c_str(); +} + +PdiEvent::PdiEvent(std::string const& event_name) : m_event_name(event_name) {} + +PdiEvent::~PdiEvent() noexcept +{ + PDI_event(m_event_name.c_str()); + for (std::string const& one_name : m_names) { + PDI_reclaim(one_name.c_str()); + } +} + +} // namespace ddc diff --git a/src/ddc/pdi.hpp b/src/ddc/pdi.hpp index cb9bfc978..25a30371a 100644 --- a/src/ddc/pdi.hpp +++ b/src/ddc/pdi.hpp @@ -36,15 +36,9 @@ class PdiEvent std::list m_metadata; - char const* store_name(std::string&& name) - { - return m_names.emplace_back(std::move(name)).c_str(); - } + char const* store_name(std::string&& name); - char const* store_name(std::string const& name) - { - return m_names.emplace_back(name).c_str(); - } + char const* store_name(std::string const& name); template T* store_scalar(T t) @@ -61,19 +55,13 @@ class PdiEvent } public: - explicit PdiEvent(std::string const& event_name) : m_event_name(event_name) {} + explicit PdiEvent(std::string const& event_name); PdiEvent(PdiEvent const& rhs) = delete; PdiEvent(PdiEvent&& rhs) noexcept = delete; - ~PdiEvent() noexcept - { - PDI_event(m_event_name.c_str()); - for (std::string const& one_name : m_names) { - PDI_reclaim(one_name.c_str()); - } - } + ~PdiEvent() noexcept; PdiEvent& operator=(PdiEvent const& rhs) = delete; diff --git a/src/ddc/print.cpp b/src/ddc/print.cpp new file mode 100644 index 000000000..1aaa95eb6 --- /dev/null +++ b/src/ddc/print.cpp @@ -0,0 +1,64 @@ +// Copyright (C) The DDC development team, see COPYRIGHT.md file +// +// SPDX-License-Identifier: MIT + +#include +#include +#include + +#include + +#include "discrete_vector.hpp" +#include "print.hpp" + +#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG) +# include +#endif + +namespace ddc::detail { + +void print_demangled_type_name(std::ostream& os, char const* const mangled_name) +{ +#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG) + int status; + + std::unique_ptr const + demangled_name(abi::__cxa_demangle(mangled_name, nullptr, nullptr, &status), std::free); + if (status != 0) { + os << "Error demangling dimension name: " << status; + return; + } + + os << demangled_name.get(); +#else + os << mangled_name; +#endif +} + +void print_single_dim_name( + std::ostream& os, + char const* const dim, + DiscreteVectorElement const size) +{ + print_demangled_type_name(os, dim); + os << '(' << size << ')'; +} + +void print_dim_name( + std::ostream& os, + char const* const* const dims, + DiscreteVectorElement const* const sizes, + std::size_t const n) +{ + if (n == 0) { + os << "Scalar"; + } else { + print_single_dim_name(os, dims[0], sizes[0]); + for (std::size_t i = 1; i < n; ++i) { + os << "×"; + print_single_dim_name(os, dims[i], sizes[i]); + } + } +} + +} // namespace ddc::detail diff --git a/src/ddc/print.hpp b/src/ddc/print.hpp index 3ee1fd055..7d6444feb 100644 --- a/src/ddc/print.hpp +++ b/src/ddc/print.hpp @@ -6,7 +6,6 @@ #include #include -#include #include #include #include @@ -18,10 +17,6 @@ #include "chunk_span.hpp" #include "discrete_vector.hpp" -#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG) -# include -#endif - namespace ddc { namespace detail { class ChunkPrinter @@ -262,43 +257,20 @@ class ChunkPrinter } }; -inline void print_demangled_type_name(std::ostream& os, char const* const mangled_name) -{ -#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG) - int status; - - std::unique_ptr const - demangled_name(abi::__cxa_demangle(mangled_name, nullptr, nullptr, &status), std::free); - if (status != 0) { - os << "Error demangling dimension name: " << status; - return; - } - - os << demangled_name.get(); -#else - os << mangled_name; -#endif -} +void print_demangled_type_name(std::ostream& os, char const* mangled_name); -inline void print_single_dim_name( +void print_dim_name( std::ostream& os, - std::type_info const& dim, - DiscreteVectorElement const size) -{ - print_demangled_type_name(os, dim.name()); - os << '(' << size << ')'; -} - -inline void print_dim_name(std::ostream& os, DiscreteVector<> const&) -{ - os << "Scalar"; -} + char const* const* dims, + DiscreteVectorElement const* sizes, + std::size_t n); -template -void print_dim_name(std::ostream& os, DiscreteVector const& dd) +template +void print_dim_name(std::ostream& os, DiscreteVector const& dd) { - print_single_dim_name(os, typeid(Dim0), get(dd)); - ((os << "×", print_single_dim_name(os, typeid(Dims), get(dd))), ...); + std::array const names {typeid(Dims).name()...}; + std::array const std_dd = detail::array(dd); + print_dim_name(os, names.data(), std_dd.data(), std_dd.size()); } } // namespace detail From 321f0a4d78fad79b704d6408ade397ab205d5068 Mon Sep 17 00:00:00 2001 From: Thomas Padioleau Date: Sat, 28 Feb 2026 11:58:56 +0100 Subject: [PATCH 2/2] Increase coverage --- src/ddc/print.hpp | 2 +- tests/CMakeLists.txt | 6 ++++ tests/discrete_element.cpp | 8 ++++++ tests/discrete_space.cpp | 26 ++++++++++++++++++ tests/discrete_space_uninitialized.cpp | 16 +++++++++++ tests/discrete_vector.cpp | 8 ++++++ tests/print.cpp | 27 ++++++++++++++++-- tests/splines/CMakeLists.txt | 1 + tests/splines/spline_boundary_conditions.cpp | 29 ++++++++++++++++++++ 9 files changed, 119 insertions(+), 4 deletions(-) create mode 100644 tests/discrete_space_uninitialized.cpp create mode 100644 tests/splines/spline_boundary_conditions.cpp diff --git a/src/ddc/print.hpp b/src/ddc/print.hpp index 7d6444feb..bde7a6460 100644 --- a/src/ddc/print.hpp +++ b/src/ddc/print.hpp @@ -268,7 +268,7 @@ void print_dim_name( template void print_dim_name(std::ostream& os, DiscreteVector const& dd) { - std::array const names {typeid(Dims).name()...}; + std::array const names {typeid(Dims).name()...}; std::array const std_dd = detail::array(dd); print_dim_name(os, names.data(), std_dd.data(), std_dd.size()); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2587f4762..4cda34f8c 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -11,6 +11,12 @@ target_compile_features(ddc_gtest_main PRIVATE cxx_std_17) target_link_libraries(ddc_gtest_main PRIVATE DDC::core GTest::gtest) target_sources(ddc_gtest_main PRIVATE main.cpp) +add_executable(ddc_tests_uninitialized) +target_compile_features(ddc_tests_uninitialized PRIVATE cxx_std_17) +target_link_libraries(ddc_tests_uninitialized PRIVATE DDC::core GTest::gtest_main) +target_sources(ddc_tests_uninitialized PRIVATE discrete_space_uninitialized.cpp) +gtest_discover_tests(ddc_tests_uninitialized DISCOVERY_MODE PRE_TEST) + add_executable( ddc_tests aligned_allocator.cpp diff --git a/tests/discrete_element.cpp b/tests/discrete_element.cpp index 8e4239335..408fd09c3 100644 --- a/tests/discrete_element.cpp +++ b/tests/discrete_element.cpp @@ -241,6 +241,14 @@ TEST(DiscreteElementXYZTest, RightExternalBinaryOperatorMinus) EXPECT_EQ(ixyz2.uid(), uid_z); } +TEST(DiscreteElement0DTest, StreamOperator) +{ + ddc::DiscreteElement<> const i0d {}; + std::stringstream ss; + ss << i0d; + EXPECT_EQ(ss.str(), "()"); +} + TEST(DiscreteElementXYZTest, StreamOperator) { ddc::DiscreteElementType const uid_x = 7; diff --git a/tests/discrete_space.cpp b/tests/discrete_space.cpp index 8aad94fa4..e07fa5914 100644 --- a/tests/discrete_space.cpp +++ b/tests/discrete_space.cpp @@ -2,6 +2,7 @@ // // SPDX-License-Identifier: MIT +#include #include #include @@ -43,3 +44,28 @@ TEST(DiscreteSpace, Initialization) static_cast(&ddc::discrete_space()), static_cast(&ddc::host_discrete_space())); } + +TEST(DiscreteSpace, DisplayDiscretizationStore) +{ + ddc::init_discrete_space(DDimX::template init( + ddc::Coordinate(0), + ddc::Coordinate(1), + ddc::DiscreteVector(2))); + std::stringstream ss; + ddc::detail::display_discretization_store(ss); +#if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG) + EXPECT_EQ( + ss.str(), + "The host discretization store is initialized:\n - " + "N49anonymous_namespace_workaround_discrete_space_cpp5DDimXE\n"); + +#elif defined(KOKKOS_COMPILER_MSVC) + EXPECT_EQ( + ss.str(), + "The host discretization store is initialized:\n - " + "struct anonymous_namespace_workaround_discrete_space_cpp::DDimX\n"); + +#else + GTEST_SKIP(); +#endif +} diff --git a/tests/discrete_space_uninitialized.cpp b/tests/discrete_space_uninitialized.cpp new file mode 100644 index 000000000..77abc3327 --- /dev/null +++ b/tests/discrete_space_uninitialized.cpp @@ -0,0 +1,16 @@ +// Copyright (C) The DDC development team, see COPYRIGHT.md file +// +// SPDX-License-Identifier: MIT + +#include + +#include + +#include + +TEST(DiscreteSpace, UninitializedDisplayDiscretizationStore) +{ + std::stringstream ss; + ddc::detail::display_discretization_store(ss); + EXPECT_EQ(ss.str(), "The host discretization store is not initialized:\n"); +} diff --git a/tests/discrete_vector.cpp b/tests/discrete_vector.cpp index e450c87e5..19646e897 100644 --- a/tests/discrete_vector.cpp +++ b/tests/discrete_vector.cpp @@ -206,6 +206,14 @@ TEST(DiscreteVectorTest, ExternalBinaryOperatorMinus) EXPECT_EQ(ddc::get(result5), dv_z - dv2_z); } +TEST(DiscreteVector0DTest, StreamOperator) +{ + ddc::DiscreteVector<> const dv0d {}; + std::stringstream ss; + ss << dv0d; + EXPECT_EQ(ss.str(), "()"); +} + TEST(DiscreteVectorTest, StreamOperator) { ddc::DiscreteVectorElement const dv_x = 7; diff --git a/tests/print.cpp b/tests/print.cpp index db374399a..c9c955d76 100644 --- a/tests/print.cpp +++ b/tests/print.cpp @@ -270,7 +270,28 @@ TEST(Print, CheckOutput3d) } #if defined(KOKKOS_COMPILER_GNU) || defined(KOKKOS_COMPILER_CLANG) -void TestPrintTestMetadata() +TEST(Print, CheckMetadata0d) +{ + using ElementType = double; + + ddc::DiscreteDomain<> const domain_0d; + + ddc::Chunk chunk("chunk", domain_0d, ddc::DeviceAllocator()); + ddc::ChunkSpan const chunk_span = chunk.span_view(); + + { + std::stringstream ss; + print_type_info(ss, chunk_span); + EXPECT_THAT( + ss.str(), + testing::MatchesRegex( + "Scalar\n" + "ddc::ChunkSpan" + ", Kokkos::layout_.+, Kokkos::.+Space>\n")); + } +} + +void TestPrintTestMetadata2d() { using ElementType = double; @@ -302,8 +323,8 @@ void TestPrintTestMetadata() } } -TEST(Print, CheckMetadata) +TEST(Print, CheckMetadata2d) { - TestPrintTestMetadata(); + TestPrintTestMetadata2d(); } #endif diff --git a/tests/splines/CMakeLists.txt b/tests/splines/CMakeLists.txt index 86f8c1136..db3b782d2 100644 --- a/tests/splines/CMakeLists.txt +++ b/tests/splines/CMakeLists.txt @@ -12,6 +12,7 @@ add_executable( bsplines.cpp knots_as_interpolation_points.cpp splines_linear_problem.cpp + spline_boundary_conditions.cpp spline_builder.cpp spline_traits.cpp view.cpp diff --git a/tests/splines/spline_boundary_conditions.cpp b/tests/splines/spline_boundary_conditions.cpp new file mode 100644 index 000000000..a047c552b --- /dev/null +++ b/tests/splines/spline_boundary_conditions.cpp @@ -0,0 +1,29 @@ +// Copyright (C) The DDC development team, see COPYRIGHT.md file +// +// SPDX-License-Identifier: MIT + +#include +#include + +#include +#include + +#include + +TEST(SplineBoundaryConditions, StreamOperator) +{ + std::stringstream ss; + ss << ddc::BoundCond::GREVILLE; + EXPECT_EQ("GREVILLE", ss.str()); + + ss.str(""); + ss << ddc::BoundCond::HERMITE; + EXPECT_EQ("HERMITE", ss.str()); + + ss.str(""); + ss << ddc::BoundCond::PERIODIC; + EXPECT_EQ("PERIODIC", ss.str()); + + ss.str(""); + EXPECT_THROW((ss << static_cast(-1)), std::runtime_error); +}