10#include <similie/misc/macros.hpp>
11#include <similie/tensor/tensor_impl.hpp>
13#include "csr_dynamic.hpp"
22struct ArrayOfVectorsToArrayOfArrays;
24template <std::size_t... I>
25struct ArrayOfVectorsToArrayOfArrays<std::index_sequence<I...>>
27 template <std::
size_t N>
29 std::array<std::array<std::size_t, N>,
sizeof...(I)>& arr,
30 std::array<std::vector<std::size_t>,
sizeof...(I)>
const& vec)
32 (std::copy_n(vec[I].begin(), N, arr[I].begin()), ...);
46 ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...> m_domain;
47 std::array<std::size_t, HeadTensorIndex::mem_size() + 1> m_coalesc_idx;
48 std::array<std::array<std::size_t, N>,
sizeof...(TailTensorIndex)> m_idx;
49 std::array<double, N> m_values;
53 ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...>
domain,
54 std::array<std::size_t, HeadTensorIndex::mem_size() + 1>
coalesc_idx,
55 std::array<std::array<std::size_t, N>,
sizeof...(TailTensorIndex)>
idx,
56 std::array<double, N>
values)
68 HeadTensorIndex::mem_size() + 1,
69 m_coalesc_idx.begin());
70 detail::ArrayOfVectorsToArrayOfArrays<
71 std::make_index_sequence<
sizeof...(TailTensorIndex)>>::run(m_idx, csr_dyn.
idx());
72 std::copy_n(csr_dyn.
values().begin(), N, m_values.begin());
75 ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...>
domain()
80 constexpr std::array<std::size_t, HeadTensorIndex::mem_size() + 1>
coalesc_idx()
const
85 constexpr std::array<std::array<std::size_t, N>,
sizeof...(TailTensorIndex)>
idx()
const
90 constexpr std::array<double, N>
values()
const
105 ddc::DiscreteDomain<TailTensorIndex...>,
106 Kokkos::layout_right,
107 Kokkos::DefaultHostExecutionSpace::memory_space>
111 ddc::DiscreteDomain<TailTensorIndex...>,
112 Kokkos::layout_right,
113 Kokkos::DefaultHostExecutionSpace::memory_space> prod,
116 ddc::DiscreteDomain<HeadTensorIndex>,
117 Kokkos::layout_right,
118 Kokkos::DefaultHostExecutionSpace::memory_space> dense,
121 SIMILIE_DEBUG_LOG(
"similie_compute_vector_dense_multiplication");
122 ddc::parallel_fill(prod, 0.);
123 for (std::size_t i = 0; i < csr.
coalesc_idx().size() - 1;
125 double const dense_value = dense.mem(ddc::DiscreteElement<HeadTensorIndex>(i));
127 std::size_t
const j_end = csr.
coalesc_idx()[i + 1];
128 Kokkos::parallel_for(
129 "similie_compute_vector_dense_multiplication",
130 Kokkos::RangePolicy<Kokkos::DefaultHostExecutionSpace>(j_begin, j_end),
132 prod(ddc::DiscreteElement<TailTensorIndex...>(csr.
idx()[ddc::type_seq_rank_v<
134 ddc::detail::TypeSeq<TailTensorIndex...>>][j]...))
135 += dense_value * csr.
values()[j];
150 ddc::DiscreteDomain<HeadTensorIndex>,
151 Kokkos::layout_right,
152 Kokkos::DefaultHostExecutionSpace::memory_space>
156 ddc::DiscreteDomain<HeadTensorIndex>,
157 Kokkos::layout_right,
158 Kokkos::DefaultHostExecutionSpace::memory_space> prod,
162 ddc::DiscreteDomain<TailTensorIndex...>,
163 Kokkos::layout_right,
164 Kokkos::DefaultHostExecutionSpace::memory_space> dense)
166 SIMILIE_DEBUG_LOG(
"similie_compute_csr_dense_multiplication");
167 ddc::parallel_fill(prod, 0.);
168 for (std::size_t i = 0; i < csr.
coalesc_idx().size() - 1;
171 std::size_t
const j_end = csr.
coalesc_idx()[i + 1];
172 Kokkos::parallel_reduce(
173 "similie_compute_csr_dense_multiplication",
174 Kokkos::RangePolicy<Kokkos::DefaultHostExecutionSpace>(j_begin, j_end),
175 [&](
const int j,
double& lsum) {
176 double const dense_value = dense(
177 ddc::DiscreteElement<TailTensorIndex...>(csr.
idx()[ddc::type_seq_rank_v<
179 ddc::detail::TypeSeq<TailTensorIndex...>>][j]...));
180 lsum += dense_value * csr.
values()[j];
182 prod.mem(ddc::DiscreteElement<HeadTensorIndex>(i)));
187template <std::size_t N,
class... TensorIndex>
190 os <<
"----------\n";
191 for (std::size_t i = 0; i < csr.
coalesc_idx().size(); ++i) {
195 for (std::size_t i = 0; i < N; ++i) {
196 for (std::size_t j = 0; j <
sizeof...(TensorIndex) - 1; ++j) {
197 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.