7#include <memory_resource>
15#include "ddc/chunk_traits.hpp"
20static constexpr PDI_inout_t default_access_v
21 = (std::is_lvalue_reference_v<T> && !std::is_const_v<std::remove_reference_t<T>>)
26static constexpr PDI_inout_t chunk_default_access_v = is_writable_chunk_v<T> ? PDI_INOUT : PDI_OUT;
30 std::string m_event_name;
32 std::vector<std::string> m_names;
35 std::pmr::monotonic_buffer_resource m_metadata;
38 explicit PdiEvent(std::string
const& event_name) : m_event_name(event_name) {}
46 PDI_event(m_event_name.c_str());
47 for (std::string
const& one_name : m_names) {
48 PDI_reclaim(one_name.c_str());
62 std::enable_if_t<is_borrowed_chunk_v<BorrowedChunk>,
int> = 0>
66 !(access & PDI_IN) || (chunk_default_access_v<BorrowedChunk> & PDI_IN),
67 "Invalid access for constant data");
68 auto extents = detail::array(data.domain().extents());
69 std::size_t& rank = *std::pmr::polymorphic_allocator<std::size_t>(&m_metadata).allocate(1);
71 PDI_share((name +
"_rank").c_str(), &rank, PDI_OUT);
72 m_names.push_back(name +
"_rank");
74 (name +
"_extents").c_str(),
75 std::pmr::vector<std::size_t>(
extents.begin(),
extents.end(), &m_metadata).data(),
77 m_names.push_back(name +
"_extents");
82 m_names.push_back(name);
89 std::enable_if_t<std::is_arithmetic_v<std::remove_reference_t<Arithmetic>>,
int> = 0>
93 !(access & PDI_IN) || (default_access_v<Arithmetic> & PDI_IN),
94 "Invalid access for constant data");
95 using value_type = std::remove_cv_t<std::remove_reference_t<Arithmetic>>;
96 value_type* data_ptr =
const_cast<value_type*
>(&data);
98 if constexpr (!(access & PDI_IN)) {
99 data_ptr = std::pmr::polymorphic_allocator<value_type>(&m_metadata).allocate(1);
102 PDI_share(name.c_str(), data_ptr, access);
103 m_names.push_back(name);
107 template <PDI_inout_t access,
class T>
110 return with<access>(name, std::forward<T>(t));
118 template <
class BorrowedChunk, std::enable_if_t<is_borrowed_chunk_v<BorrowedChunk>,
int> = 0>
121 return with<chunk_default_access_v<BorrowedChunk>>(name, std::forward<BorrowedChunk>(data));
127 std::enable_if_t<std::is_arithmetic_v<std::remove_reference_t<Arithmetic>>,
int> = 0>
130 return with<default_access_v<Arithmetic>>(name, std::forward<Arithmetic>(data));
137 return with(name, std::forward<T>(t));
143template <PDI_inout_t access,
class DataType>
146 PdiEvent(name).
with<access>(name, std::forward<DataType>(data));
149template <
class DataType>
152 PdiEvent(name).
with(name, std::forward<DataType>(data));
PdiEvent(PdiEvent const &rhs)=delete
PdiEvent & and_with(std::string const &name, T &&t)
With synonym.
Definition: pdi.hpp:135
PdiEvent & and_with(std::string const &name, T &&t)
Definition: pdi.hpp:108
PdiEvent & operator=(PdiEvent &&rhs) noexcept=delete
~PdiEvent() noexcept
Definition: pdi.hpp:44
PdiEvent & operator=(PdiEvent const &rhs)=delete
PdiEvent(std::string const &event_name)
Definition: pdi.hpp:38
PdiEvent & with(std::string const &name, Arithmetic &&data)
Arithmetic overload.
Definition: pdi.hpp:128
PdiEvent & with(std::string const &name, BorrowedChunk &&data)
API with access deduction.
Definition: pdi.hpp:119
PdiEvent & with(std::string const &name, Arithmetic &&data)
Definition: pdi.hpp:90
PdiEvent & with(std::string const &name, BorrowedChunk &&data)
Definition: pdi.hpp:63
PdiEvent(PdiEvent &&rhs) noexcept=delete
The top-level namespace of DDC.
Definition: aligned_allocator.hpp:11
void expose_to_pdi(std::string const &name, DataType &&data)
Definition: pdi.hpp:144
KOKKOS_FUNCTION constexpr DiscreteVector< QueryDDims... > extents(DiscreteDomain< DDims... > const &domain) noexcept
Definition: discrete_domain.hpp:485
typename chunk_traits< T >::value_type chunk_value_t
Definition: chunk_traits.hpp:37