28 template <
typename A,
typename C>
29 void mkl_otrans(A&& a, C&& c) {
30 a.ensure_cpu_up_to_date();
32 auto mem_c = c.memory_start();
33 auto mem_a = a.memory_start();
35 if constexpr (all_single_precision<A, C>) {
36 if (is_row_major<A>) {
37 mkl_somatcopy(
'R',
'T', etl::dim<0>(a), etl::dim<1>(a), 1.0f, mem_a, etl::dim<1>(a), mem_c, etl::dim<0>(a));
39 mkl_somatcopy(
'C',
'T', etl::dim<0>(a), etl::dim<1>(a), 1.0f, mem_a, etl::dim<0>(a), mem_c, etl::dim<1>(a));
41 }
else if constexpr (all_double_precision<A, C>) {
42 if (is_row_major<A>) {
43 mkl_domatcopy(
'R',
'T', etl::dim<0>(a), etl::dim<1>(a), 1.0, mem_a, etl::dim<1>(a), mem_c, etl::dim<0>(a));
45 mkl_domatcopy(
'C',
'T', etl::dim<0>(a), etl::dim<1>(a), 1.0, mem_a, etl::dim<0>(a), mem_c, etl::dim<1>(a));
57 void mkl_itrans(C&& c) {
58 c.ensure_cpu_up_to_date();
60 if constexpr (is_single_precision<C>) {
61 if (is_row_major<C>) {
62 mkl_simatcopy(
'R',
'T', etl::dim<0>(c), etl::dim<1>(c), 1.0f, c.memory_start(), etl::dim<1>(c), etl::dim<0>(c));
64 mkl_simatcopy(
'C',
'T', etl::dim<0>(c), etl::dim<1>(c), 1.0f, c.memory_start(), etl::dim<0>(c), etl::dim<1>(c));
66 }
else if constexpr (is_double_precision<C>) {
67 if (is_row_major<C>) {
68 mkl_dimatcopy(
'R',
'T', etl::dim<0>(c), etl::dim<1>(c), 1.0, c.memory_start(), etl::dim<1>(c), etl::dim<0>(c));
70 mkl_dimatcopy(
'C',
'T', etl::dim<0>(c), etl::dim<1>(c), 1.0, c.memory_start(), etl::dim<0>(c), etl::dim<1>(c));
83 if constexpr (is_dma<C> && is_floating<C>) {
86 cpp_unreachable(
"Invalid call to blas:inplace_square_transpose");
96 if constexpr (is_dma<C> && is_floating<C>) {
99 cpp_unreachable(
"Invalid call to blas:inplace_rectangular_transpose");
108 template <
typename A,
typename C>
110 if constexpr (all_dma<A, C> && all_floating<A, C>) {
111 auto mem_c = c.memory_start();
112 auto mem_a = a.memory_start();
115 if (mem_c == mem_a) {
116 if (etl::dim<0>(a) == etl::dim<1>(a)) {
125 cpp_unreachable(
"Invalid call to blas:tranpose");
137 template <
typename C>
139 cpp_unreachable(
"MKL not enabled/available");
146 template <
typename C>
148 cpp_unreachable(
"MKL not enabled/available");
156 template <
typename A,
typename C>
157 void transpose([[maybe_unused]] A&& a, [[maybe_unused]] C&& c) {
158 cpp_unreachable(
"MKL not enabled/available");
void inplace_square_transpose([[maybe_unused]] C &&c)
Inplace transposition of the square matrix c.
Definition: transpose.hpp:138
void inplace_rectangular_transpose([[maybe_unused]] C &&c)
Inplace transposition of the rectangular matrix c.
Definition: transpose.hpp:147
auto transpose(const E &value)
Returns the transpose of the given expression.
Definition: expression_builder.hpp:528
decltype(auto) force_temporary(E &&expr)
Force a temporary out of the expression.
Definition: temporary.hpp:91