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 KOKKOS_FUNCTION
constexpr ddc::DiscreteDomain<HeadTensorIndex, TailTensorIndex...>
domain()
81 KOKKOS_FUNCTION
constexpr std::array<std::size_t, HeadTensorIndex::mem_size() + 1>
const&
87 KOKKOS_FUNCTION
constexpr std::
88 array<std::array<std::size_t, N>,
sizeof...(TailTensorIndex)>
const&
94 KOKKOS_FUNCTION
constexpr std::array<double, N>
const&
values()
const
109 ddc::DiscreteDomain<TailTensorIndex...>,
110 Kokkos::layout_right,
111 Kokkos::DefaultHostExecutionSpace::memory_space>
115 ddc::DiscreteDomain<TailTensorIndex...>,
116 Kokkos::layout_right,
117 Kokkos::DefaultHostExecutionSpace::memory_space> prod,
120 ddc::DiscreteDomain<HeadTensorIndex>,
121 Kokkos::layout_right,
122 Kokkos::DefaultHostExecutionSpace::memory_space> dense,
125 SIMILIE_DEBUG_LOG(
"similie_compute_vector_dense_multiplication");
126 ddc::host_for_each(prod.domain(), [&](
const ddc::DiscreteElement<TailTensorIndex...> elem) {
129 for (std::size_t i = 0; i < csr.
coalesc_idx().size() - 1;
131 double const dense_value = dense.mem(ddc::DiscreteElement<HeadTensorIndex>(i));
133 std::size_t
const j_end = csr.
coalesc_idx()[i + 1];
134 for (
int j = j_begin; j < j_end; j++) {
135 prod(ddc::DiscreteElement<TailTensorIndex...>(csr.
idx()[ddc::type_seq_rank_v<
137 ddc::detail::TypeSeq<TailTensorIndex...>>][j]...))
138 += dense_value * csr.
values()[j];
153 ddc::DiscreteDomain<HeadTensorIndex>,
154 Kokkos::layout_right,
155 Kokkos::DefaultHostExecutionSpace::memory_space>
159 ddc::DiscreteDomain<HeadTensorIndex>,
160 Kokkos::layout_right,
161 Kokkos::DefaultHostExecutionSpace::memory_space> prod,
165 ddc::DiscreteDomain<TailTensorIndex...>,
166 Kokkos::layout_right,
167 Kokkos::DefaultHostExecutionSpace::memory_space> dense)
169 SIMILIE_DEBUG_LOG(
"similie_compute_csr_dense_multiplication");
170 ddc::host_for_each(prod.domain(), [&](
const ddc::DiscreteElement<HeadTensorIndex> elem) {
173 for (std::size_t i = 0; i < csr.
coalesc_idx().size() - 1;
176 std::size_t
const j_end = csr.
coalesc_idx()[i + 1];
178 for (
int j = j_begin; j < j_end; j++) {
179 double const dense_value
180 = dense(ddc::DiscreteElement<TailTensorIndex...>(csr.
idx()[ddc::type_seq_rank_v<
182 ddc::detail::TypeSeq<TailTensorIndex...>>][j]...));
183 lsum += dense_value * csr.
values()[j];
185 prod.mem(ddc::DiscreteElement<HeadTensorIndex>(i)) = lsum;
190template <std::size_t N,
class... TensorIndex>
193 os <<
"----------\n";
194 for (std::size_t i = 0; i < csr.
coalesc_idx().size(); ++i) {
198 for (std::size_t i = 0; i < N; ++i) {
199 for (std::size_t j = 0; j <
sizeof...(TensorIndex) - 1; ++j) {
200 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
KOKKOS_FUNCTION constexpr std::array< std::size_t, HeadTensorIndex::mem_size()+1 > const & coalesc_idx() const
KOKKOS_FUNCTION constexpr std::array< std::array< std::size_t, N >, sizeof...(TailTensorIndex)> const & idx() const
KOKKOS_FUNCTION constexpr std::array< double, N > const & values() const
Csr(CsrDynamic< HeadTensorIndex, TailTensorIndex... > csr_dyn)
KOKKOS_FUNCTION constexpr ddc::DiscreteDomain< HeadTensorIndex, TailTensorIndex... > domain() const
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.