10#include <similie/tensor/tensor_impl.hpp>
12#include "csr_dynamic.hpp"
21struct ArrayOfVectorsToArrayOfArrays;
23template <std::size_t... I>
24struct ArrayOfVectorsToArrayOfArrays<std::index_sequence<I...>>
26 template <std::
size_t N>
28 std::array<std::array<std::size_t, N>,
sizeof...(I)>& arr,
29 std::array<std::vector<std::size_t>,
sizeof...(I)>
const& vec)
31 (std::copy_n(vec[I].begin(), N, arr[I].begin()), ...);
45 ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...> m_domain;
46 std::array<std::size_t, HeadTensorIndex::mem_size() + 1> m_coalesc_idx;
47 std::array<std::array<std::size_t, N>,
sizeof...(TailTensorIndex)> m_idx;
48 std::array<double, N> m_values;
52 ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...>
domain,
53 std::array<std::size_t, HeadTensorIndex::mem_size() + 1>
coalesc_idx,
54 std::array<std::array<std::size_t, N>,
sizeof...(TailTensorIndex)>
idx,
55 std::array<double, N>
values)
67 HeadTensorIndex::mem_size() + 1,
68 m_coalesc_idx.begin());
69 detail::ArrayOfVectorsToArrayOfArrays<
70 std::make_index_sequence<
sizeof...(TailTensorIndex)>>::run(m_idx, csr_dyn.
idx());
71 std::copy_n(csr_dyn.
values().begin(), N, m_values.begin());
74 ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...>
domain()
79 constexpr std::array<std::size_t, HeadTensorIndex::mem_size() + 1>
coalesc_idx()
const
84 constexpr std::array<std::array<std::size_t, N>,
sizeof...(TailTensorIndex)>
idx()
const
89 constexpr std::array<double, N>
values()
const
104 ddc::DiscreteDomain<TailTensorIndex...>,
105 Kokkos::layout_right,
106 Kokkos::DefaultHostExecutionSpace::memory_space>
110 ddc::DiscreteDomain<TailTensorIndex...>,
111 Kokkos::layout_right,
112 Kokkos::DefaultHostExecutionSpace::memory_space> prod,
115 ddc::DiscreteDomain<HeadTensorIndex>,
116 Kokkos::layout_right,
117 Kokkos::DefaultHostExecutionSpace::memory_space> dense,
120 ddc::parallel_fill(prod, 0.);
121 for (std::size_t i = 0; i < csr.
coalesc_idx().size() - 1;
123 double const dense_value = dense.mem(ddc::DiscreteElement<HeadTensorIndex>(i));
125 std::size_t
const j_end = csr.
coalesc_idx()[i + 1];
126 Kokkos::parallel_for(
127 "vector_dense_multiplication",
128 Kokkos::RangePolicy<Kokkos::DefaultHostExecutionSpace>(j_begin, j_end),
130 prod(ddc::DiscreteElement<TailTensorIndex...>(csr.
idx()[ddc::type_seq_rank_v<
132 ddc::detail::TypeSeq<TailTensorIndex...>>][j]...))
133 += dense_value * csr.
values()[j];
148 ddc::DiscreteDomain<HeadTensorIndex>,
149 Kokkos::layout_right,
150 Kokkos::DefaultHostExecutionSpace::memory_space>
154 ddc::DiscreteDomain<HeadTensorIndex>,
155 Kokkos::layout_right,
156 Kokkos::DefaultHostExecutionSpace::memory_space> prod,
160 ddc::DiscreteDomain<TailTensorIndex...>,
161 Kokkos::layout_right,
162 Kokkos::DefaultHostExecutionSpace::memory_space> dense)
164 ddc::parallel_fill(prod, 0.);
165 for (std::size_t i = 0; i < csr.
coalesc_idx().size() - 1;
168 std::size_t
const j_end = csr.
coalesc_idx()[i + 1];
169 Kokkos::parallel_reduce(
170 "csr_dense_multiplication",
171 Kokkos::RangePolicy<Kokkos::DefaultHostExecutionSpace>(j_begin, j_end),
172 [&](
const int j,
double& lsum) {
173 double const dense_value = dense(
174 ddc::DiscreteElement<TailTensorIndex...>(csr.
idx()[ddc::type_seq_rank_v<
176 ddc::detail::TypeSeq<TailTensorIndex...>>][j]...));
177 lsum += dense_value * csr.
values()[j];
179 prod.mem(ddc::DiscreteElement<HeadTensorIndex>(i)));
184template <std::size_t N,
class... TensorIndex>
187 os <<
"----------\n";
188 for (std::size_t i = 0; i < csr.
coalesc_idx().size(); ++i) {
192 for (std::size_t i = 0; i < N; ++i) {
193 for (std::size_t j = 0; j <
sizeof...(TensorIndex) - 1; ++j) {
194 os << csr.
idx()[j][i] <<
" ";
std::array< std::vector< std::size_t >, sizeof...(TailTensorIndex)> idx() const
std::vector< double > values() const
std::vector< std::size_t > coalesc_idx() const
constexpr std::array< std::array< std::size_t, N >, sizeof...(TailTensorIndex)> idx() const
constexpr std::array< double, N > values() const
constexpr std::array< std::size_t, HeadTensorIndex::mem_size()+1 > coalesc_idx() const
Csr(CsrDynamic< HeadTensorIndex, TailTensorIndex... > csr_dyn)
ddc::DiscreteDomain< HeadTensorIndex, TailTensorIndex... > domain()
constexpr Csr(ddc::DiscreteDomain< HeadTensorIndex, TailTensorIndex... > domain, std::array< std::size_t, HeadTensorIndex::mem_size()+1 > coalesc_idx, std::array< std::array< std::size_t, N >, sizeof...(TailTensorIndex)> idx, std::array< double, N > values)
sil::tensor::Tensor< double, ddc::DiscreteDomain< TailTensorIndex... >, Kokkos::layout_right, Kokkos::DefaultHostExecutionSpace::memory_space > tensor_prod(sil::tensor::Tensor< double, ddc::DiscreteDomain< TailTensorIndex... >, Kokkos::layout_right, Kokkos::DefaultHostExecutionSpace::memory_space > prod, sil::tensor::Tensor< double, ddc::DiscreteDomain< HeadTensorIndex >, Kokkos::layout_right, Kokkos::DefaultHostExecutionSpace::memory_space > dense, Csr< N, HeadTensorIndex, TailTensorIndex... > csr)
std::ostream & operator<<(std::ostream &os, Csr< N, TensorIndex... > const &csr)
Tensor(ddc::Chunk< ElementType, SupportType, Allocator >) -> Tensor< ElementType, SupportType, Kokkos::layout_right, typename Allocator::memory_space >
The top-level namespace of SimiLie.