16 #include "etl/impl/cublas/cuda.hpp" 25 template <etl_expr T,
bool Aligned>
26 struct sub_matrix_3d final : iterable<sub_matrix_3d<T, Aligned>, false>,
27 assignable<sub_matrix_3d<T, Aligned>, value_t<T>>,
28 value_testable<sub_matrix_3d<T, Aligned>>,
29 inplace_assignable<sub_matrix_3d<T, Aligned>> {
45 template <
typename V = default_vec>
48 using assignable_base_type::operator=;
72 : sub_expr(sub_expr), base_i(i), base_j(j), base_k(k), m(m), n(n), o(o) {}
80 cpp_assert(f < m * n * o,
"Invalid index inside sub_matrix_3d");
84 auto my_i = f / (n * o);
90 return sub_expr(base_i + my_i, base_j + my_j, base_k + my_k);
93 auto my_k = f / (m * n);
99 return sub_expr(base_i + my_i, base_j + my_j, base_k + my_k);
109 cpp_assert(f < m * n * o,
"Invalid index inside sub_matrix_3d");
113 auto my_i = f / (n * o);
114 auto t = f % (n * o);
119 return sub_expr(base_i + my_i, base_j + my_j, base_k + my_k);
122 auto my_k = f / (m * n);
123 auto t = f % (m * n);
128 return sub_expr(base_i + my_i, base_j + my_j, base_k + my_k);
139 cpp_assert(f < m * n * o,
"Invalid index inside sub_matrix_3d");
143 auto my_i = f / (n * o);
144 auto t = f % (n * o);
149 return sub_expr(base_i + my_i, base_j + my_j, base_k + my_k);
152 auto my_k = f / (m * n);
153 auto t = f % (m * n);
158 return sub_expr(base_i + my_i, base_j + my_j, base_k + my_k);
169 cpp_assert(i < m,
"Invalid 3d index inside sub_matrix_3d");
170 cpp_assert(j < n,
"Invalid 3d index inside sub_matrix_3d");
171 cpp_assert(k < o,
"Invalid 3d index inside sub_matrix_3d");
173 return sub_expr(base_i + i, base_j + j, base_k + k);
183 cpp_assert(i < m,
"Invalid 3d index inside sub_matrix_3d");
184 cpp_assert(j < n,
"Invalid 3d index inside sub_matrix_3d");
185 cpp_assert(k < o,
"Invalid 3d index inside sub_matrix_3d");
187 return sub_expr(base_i + i, base_j + j, base_k + k);
196 return sub(*
this, x);
204 template <
typename E>
205 bool alias(
const E& rhs)
const noexcept {
206 return sub_expr.alias(rhs);
217 return sub_expr.unsafe_dimension_access(x);
226 template <
typename L>
235 template <
typename L>
244 template <
typename L>
253 template <
typename L>
262 template <
typename L>
271 template <
typename L>
284 sub_expr.ensure_cpu_up_to_date();
293 sub_expr.ensure_gpu_up_to_date();
301 sub_expr.visit(visitor);
311 return os <<
"sub(" << v.sub_expr <<
", " << v.base_i <<
", " << v.base_j <<
", " << v.base_k <<
", " << v.m <<
", " << v.n <<
", " << v.o <<
")";
318 template <
typename T,
bool Aligned>
325 static constexpr
bool is_etl =
true;
330 static constexpr
bool is_linear = sub_traits::is_linear;
332 static constexpr
bool is_value =
false;
333 static constexpr
bool is_direct =
false;
334 static constexpr
bool is_generator =
false;
335 static constexpr
bool is_padded =
false;
336 static constexpr
bool is_aligned =
false;
337 static constexpr
bool is_temporary = sub_traits::is_temporary;
338 static constexpr
bool gpu_computable =
false;
339 static constexpr
order storage_order = sub_traits::storage_order;
346 template <vector_mode_t V>
347 static constexpr
bool vectorizable =
false;
355 return v.m * v.n * v.o;
std::decay_t< T > sub_expr_t
The sub expression type.
Definition: sub_matrix_3d.hpp:321
CRTP class to inject iterators functions.
Definition: iterable.hpp:23
auto operator()(size_t x) const
Creates a sub view of the matrix, effectively removing the first dimension and fixing it to the given...
Definition: sub_matrix_3d.hpp:195
void assign_div_to(L &&lhs) const
Divide the given left-hand-side expression.
Definition: sub_matrix_3d.hpp:263
friend std::ostream & operator<<(std::ostream &os, const sub_matrix_3d &v)
Print a representation of the view on the given stream.
Definition: sub_matrix_3d.hpp:310
View that shows a 3d sub matrix of an expression.
Definition: expr_fwd.hpp:65
void ensure_gpu_up_to_date() const
Copy back from the GPU to the expression memory if necessary.
Definition: sub_matrix_3d.hpp:291
void std_assign_evaluate(Expr &&expr, Result &&result)
Evaluation of the expr into result.
Definition: evaluator.hpp:1176
void assign_sub_to(L &&lhs) const
Sub from the given left-hand-side expression.
Definition: sub_matrix_3d.hpp:245
void assign_mul_to(L &&lhs) const
Multiply the given left-hand-side expression.
Definition: sub_matrix_3d.hpp:254
void assign_to(L &&lhs) const
Assign to the given left-hand-side expression.
Definition: sub_matrix_3d.hpp:227
static size_t dim(const expr_t &v, size_t d) noexcept
Returns the dth dimension of the given expression.
Definition: sub_matrix_3d.hpp:364
value_t< sub_type > value_type
The value contained in the expression.
Definition: dyn_matrix_view.hpp:31
constexpr bool is_magic_view
Traits indicating if the given ETL type is a magic view expression.
Definition: traits.hpp:311
order
Storage order of a matrix.
Definition: order.hpp:15
void visit(detail::evaluator_visitor &visitor) const
Apply the given visitor to this expression and its descendants.
Definition: sub_matrix_3d.hpp:300
const_memory_t< sub_type > const_memory_type
The const memory access type.
Definition: sub_matrix_3d.hpp:36
std::conditional_t< std::is_lvalue_reference_v< S >, const value_t< T > &, value_t< T > > const_return_helper
Definition: traits.hpp:872
bool alias(const E &rhs) const noexcept
Test if this expression aliases with the given expression.
Definition: sub_matrix_3d.hpp:205
const_return_helper< sub_type, decltype(std::declval< sub_type >()[0])> const_return_type
The const type return by the view.
Definition: sub_matrix_3d.hpp:38
constexpr bool is_fast
Traits to test if the given ETL expresion type is fast (sizes known at compile-time) ...
Definition: traits.hpp:588
value_t< sub_type > value_type
The value contained in the expression.
Definition: sub_matrix_3d.hpp:34
auto end() noexcept
Return an iterator to the past-the-end element of the matrix.
Definition: iterable.hpp:59
sub_matrix_3d(sub_type sub_expr, size_t i, size_t j, size_t k, size_t m, size_t n, size_t o)
Construct a new sub_matrix_3d over the given sub expression.
Definition: sub_matrix_3d.hpp:71
Traits to get information about ETL types.
Definition: tmp.hpp:68
Root namespace for the ETL library.
Definition: adapter.hpp:15
std::conditional_t< std::is_const_v< std::remove_reference_t< S > >, const value_t< T > &, std::conditional_t< std::is_lvalue_reference_v< S > &&!std::is_const_v< T >, value_t< T > &, value_t< T > >> return_helper
Definition: traits.hpp:866
std::conditional_t< std::is_const_v< std::remove_reference_t< S > >, typename std::decay_t< S >::const_memory_type, typename std::decay_t< S >::memory_type > memory_t
Traits to extract the direct memory type out of an ETL type.
Definition: tmp.hpp:88
typename std::decay_t< S >::const_memory_type const_memory_t
Traits to extract the direct const memory type out of an ETL type.
Definition: tmp.hpp:94
typename V::template vec_type< value_type > vec_type
The vectorization type for V.
Definition: sub_matrix_3d.hpp:46
Visitor to perform local evaluation when necessary.
Definition: eval_visitors.hpp:23
static size_t size(const expr_t &v) noexcept
Returns the size of the given expression.
Definition: sub_matrix_3d.hpp:354
Configurable iterator for ETL expressions.
Definition: iterator.hpp:24
void std_mod_evaluate(Expr &&expr, Result &&result)
Compound modulo evaluation of the expr into result.
Definition: evaluator.hpp:1271
auto begin() noexcept
Return an iterator to the first element of the matrix.
Definition: iterable.hpp:46
void std_mul_evaluate(Expr &&expr, Result &&result)
Compound multiply evaluation of the expr into result.
Definition: evaluator.hpp:1233
static constexpr size_t dimensions() noexcept
Returns the number of expressions for this type.
Definition: sub_matrix_3d.hpp:378
constexpr bool is_transformer
Traits indicating if the given ETL type is a transformer expression.
Definition: traits.hpp:297
return_helper< sub_type, decltype(std::declval< sub_type >()[0])> return_type
The type returned by the view.
Definition: sub_matrix_3d.hpp:37
value_type read_flat(size_t f) const noexcept(assert_nothrow)
Returns the value at the given index This function never has side effects.
Definition: sub_matrix_3d.hpp:138
memory_t< sub_type > memory_type
The memory acess type.
Definition: sub_matrix_3d.hpp:35
constexpr bool is_view
Traits indicating if the given ETL type is a view expression.
Definition: traits.hpp:304
CRTP class to inject assign operations to matrix and vector structures.
Definition: assignable.hpp:25
ETL_STRONG_INLINE(const_return_type) operator()(size_t i
Access to the element at the given (args...) position.
void std_sub_evaluate(Expr &&expr, Result &&result)
Compound subtract evaluation of the expr into result.
Definition: evaluator.hpp:1214
void ensure_cpu_up_to_date() const
Ensures that the GPU memory is allocated and that the GPU memory is up to date (to undefined value)...
Definition: sub_matrix_3d.hpp:282
static constexpr int complexity() noexcept
Estimate the complexity of computation.
Definition: sub_matrix_3d.hpp:386
size_t & unsafe_dimension_access(size_t x)
Returns a reference to the ith dimension value.
Definition: sub_matrix_3d.hpp:216
T sub_type
The sub type.
Definition: sub_matrix_3d.hpp:33
constexpr bool is_thread_safe
Traits to test if the given ETL expresion type is thread safe.
Definition: traits.hpp:687
return_type operator[](size_t f)
Returns the element at the given index.
Definition: sub_matrix_3d.hpp:108
typename decay_traits< E >::value_type value_t
Traits to extract the value type out of an ETL type.
Definition: tmp.hpp:81
void std_div_evaluate(Expr &&expr, Result &&result)
Compound divide evaluation of the expr into result.
Definition: evaluator.hpp:1252
const_return_type operator[](size_t f) const
Returns the element at the given index.
Definition: sub_matrix_3d.hpp:79
void assign_add_to(L &&lhs) const
Add to the given left-hand-side expression.
Definition: sub_matrix_3d.hpp:236
void std_add_evaluate(Expr &&expr, Result &&result)
Compound add evaluation of the expr into result.
Definition: evaluator.hpp:1195
typename sub_traits::value_type value_type
The value type of the expression.
Definition: sub_matrix_3d.hpp:323
void assign_mod_to(L &&lhs) const
Modulo the given left-hand-side expression.
Definition: sub_matrix_3d.hpp:272