AssignmentFunctors.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5 //
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 
10 #ifndef EIGEN_ASSIGNMENT_FUNCTORS_H
11 #define EIGEN_ASSIGNMENT_FUNCTORS_H
12 
13 // IWYU pragma: private
14 #include "../InternalHeaderCheck.h"
15 
16 namespace Eigen {
17 
18 namespace internal {
19 
24 template <typename DstScalar, typename SrcScalar>
25 struct assign_op {
26  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a = b; }
27 
28  template <int Alignment, typename Packet>
29  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
30  internal::pstoret<DstScalar, Packet, Alignment>(a, b);
31  }
32 };
33 
34 // Empty overload for void type (used by PermutationMatrix)
35 template <typename DstScalar>
36 struct assign_op<DstScalar, void> {};
37 
38 template <typename DstScalar, typename SrcScalar>
39 struct functor_traits<assign_op<DstScalar, SrcScalar> > {
40  enum {
44  };
45 };
46 
51 template <typename DstScalar, typename SrcScalar>
52 struct add_assign_op {
53  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a += b; }
54 
55  template <int Alignment, typename Packet>
56  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
57  internal::pstoret<DstScalar, Packet, Alignment>(a, internal::padd(internal::ploadt<Packet, Alignment>(a), b));
58  }
59 };
60 template <typename DstScalar, typename SrcScalar>
61 struct functor_traits<add_assign_op<DstScalar, SrcScalar> > {
62  enum {
65  };
66 };
67 
72 template <typename DstScalar, typename SrcScalar>
73 struct sub_assign_op {
74  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a -= b; }
75 
76  template <int Alignment, typename Packet>
77  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
78  internal::pstoret<DstScalar, Packet, Alignment>(a, internal::psub(internal::ploadt<Packet, Alignment>(a), b));
79  }
80 };
81 template <typename DstScalar, typename SrcScalar>
82 struct functor_traits<sub_assign_op<DstScalar, SrcScalar> > {
83  enum {
86  };
87 };
88 
93 template <typename DstScalar, typename SrcScalar = DstScalar>
94 struct mul_assign_op {
95  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a *= b; }
96 
97  template <int Alignment, typename Packet>
98  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
99  internal::pstoret<DstScalar, Packet, Alignment>(a, internal::pmul(internal::ploadt<Packet, Alignment>(a), b));
100  }
101 };
102 template <typename DstScalar, typename SrcScalar>
103 struct functor_traits<mul_assign_op<DstScalar, SrcScalar> > {
104  enum {
107  };
108 };
109 
114 template <typename DstScalar, typename SrcScalar = DstScalar>
116  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar& a, const SrcScalar& b) const { a /= b; }
117 
118  template <int Alignment, typename Packet>
119  EIGEN_STRONG_INLINE void assignPacket(DstScalar* a, const Packet& b) const {
120  internal::pstoret<DstScalar, Packet, Alignment>(a, internal::pdiv(internal::ploadt<Packet, Alignment>(a), b));
121  }
122 };
123 template <typename DstScalar, typename SrcScalar>
124 struct functor_traits<div_assign_op<DstScalar, SrcScalar> > {
125  enum {
128  };
129 };
130 
146 template <typename Scalar>
149 #ifdef EIGEN_GPUCC
150  // FIXME is there some kind of cuda::swap?
151  Scalar t = b;
152  const_cast<Scalar&>(b) = a;
153  a = t;
154 #else
155  using std::swap;
156  swap(a, const_cast<Scalar&>(b));
157 #endif
158  }
159 };
160 template <typename Scalar>
162  enum {
164  PacketAccess =
165 #if defined(EIGEN_VECTORIZE_AVX) && (EIGEN_CLANG_STRICT_LESS_THAN(8, 0, 0) || EIGEN_COMP_CLANGAPPLE)
166  // This is a partial workaround for a bug in clang generating bad code
167  // when mixing 256/512 bits loads and 128 bits moves.
168  // See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1684
169  // https://bugs.llvm.org/show_bug.cgi?id=40815
170  0
171 #else
173 #endif
174  };
175 };
176 
177 } // namespace internal
178 
179 } // namespace Eigen
180 
181 #endif // EIGEN_ASSIGNMENT_FUNCTORS_H
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:892
#define EIGEN_STRONG_INLINE
Definition: Macros.h:834
Scalar * b
Definition: benchVecAdd.cpp:17
SCALAR Scalar
Definition: bench_gemm.cpp:45
EIGEN_BLAS_FUNC() swap(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
Definition: level1_impl.h:117
const Scalar * a
Definition: level2_cplx_impl.h:32
EIGEN_DEVICE_FUNC Packet padd(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:318
EIGEN_DEVICE_FUNC Packet pdiv(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:368
EIGEN_STRONG_INLINE Packet4cf pmul(const Packet4cf &a, const Packet4cf &b)
Definition: AVX/Complex.h:88
EIGEN_DEVICE_FUNC Packet psub(const Packet &a, const Packet &b)
Definition: GenericPacketMath.h:337
void swap(scoped_array< T > &a, scoped_array< T > &b)
Definition: Memory.h:734
Namespace containing all symbols from the Eigen library.
Definition: bench_norm.cpp:70
Definition: Eigen_Colamd.h:49
t
Definition: plotPSD.py:36
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:217
Template functor for scalar/packet assignment with addition.
Definition: AssignmentFunctors.h:52
EIGEN_STRONG_INLINE void assignPacket(DstScalar *a, const Packet &b) const
Definition: AssignmentFunctors.h:56
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar &a, const SrcScalar &b) const
Definition: AssignmentFunctors.h:53
Template functor for scalar/packet assignment.
Definition: AssignmentFunctors.h:25
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar &a, const SrcScalar &b) const
Definition: AssignmentFunctors.h:26
EIGEN_STRONG_INLINE void assignPacket(DstScalar *a, const Packet &b) const
Definition: AssignmentFunctors.h:29
Template functor for scalar/packet assignment with diviving.
Definition: AssignmentFunctors.h:115
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar &a, const SrcScalar &b) const
Definition: AssignmentFunctors.h:116
EIGEN_STRONG_INLINE void assignPacket(DstScalar *a, const Packet &b) const
Definition: AssignmentFunctors.h:119
Definition: XprHelper.h:205
@ PacketAccess
Definition: XprHelper.h:206
@ Cost
Definition: XprHelper.h:206
Definition: Meta.h:205
Template functor for scalar/packet assignment with multiplication.
Definition: AssignmentFunctors.h:94
EIGEN_STRONG_INLINE void assignPacket(DstScalar *a, const Packet &b) const
Definition: AssignmentFunctors.h:98
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar &a, const SrcScalar &b) const
Definition: AssignmentFunctors.h:95
Definition: GenericPacketMath.h:108
Template functor for scalar/packet assignment with subtraction.
Definition: AssignmentFunctors.h:73
EIGEN_STRONG_INLINE void assignPacket(DstScalar *a, const Packet &b) const
Definition: AssignmentFunctors.h:77
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(DstScalar &a, const SrcScalar &b) const
Definition: AssignmentFunctors.h:74
Template functor for scalar/packet assignment with swapping.
Definition: AssignmentFunctors.h:147
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar &a, const Scalar &b) const
Definition: AssignmentFunctors.h:148
Definition: ZVector/PacketMath.h:50