Eigen libary for mbed

Committer:
jsoh91
Date:
Tue Sep 24 00:18:23 2019 +0000
Revision:
1:3b8049da21b8
Parent:
0:13a5d365ba16
ignore and revise some of error parts

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ykuroda 0:13a5d365ba16 1 /*
ykuroda 0:13a5d365ba16 2 Copyright (c) 2011, Intel Corporation. All rights reserved.
ykuroda 0:13a5d365ba16 3
ykuroda 0:13a5d365ba16 4 Redistribution and use in source and binary forms, with or without modification,
ykuroda 0:13a5d365ba16 5 are permitted provided that the following conditions are met:
ykuroda 0:13a5d365ba16 6
ykuroda 0:13a5d365ba16 7 * Redistributions of source code must retain the above copyright notice, this
ykuroda 0:13a5d365ba16 8 list of conditions and the following disclaimer.
ykuroda 0:13a5d365ba16 9 * Redistributions in binary form must reproduce the above copyright notice,
ykuroda 0:13a5d365ba16 10 this list of conditions and the following disclaimer in the documentation
ykuroda 0:13a5d365ba16 11 and/or other materials provided with the distribution.
ykuroda 0:13a5d365ba16 12 * Neither the name of Intel Corporation nor the names of its contributors may
ykuroda 0:13a5d365ba16 13 be used to endorse or promote products derived from this software without
ykuroda 0:13a5d365ba16 14 specific prior written permission.
ykuroda 0:13a5d365ba16 15
ykuroda 0:13a5d365ba16 16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ykuroda 0:13a5d365ba16 17 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
ykuroda 0:13a5d365ba16 18 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
ykuroda 0:13a5d365ba16 19 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ykuroda 0:13a5d365ba16 20 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
ykuroda 0:13a5d365ba16 21 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
ykuroda 0:13a5d365ba16 22 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ykuroda 0:13a5d365ba16 23 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
ykuroda 0:13a5d365ba16 24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
ykuroda 0:13a5d365ba16 25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
ykuroda 0:13a5d365ba16 26
ykuroda 0:13a5d365ba16 27 ********************************************************************************
ykuroda 0:13a5d365ba16 28 * Content : Eigen bindings to Intel(R) MKL
ykuroda 0:13a5d365ba16 29 * MKL VML support for coefficient-wise unary Eigen expressions like a=b.sin()
ykuroda 0:13a5d365ba16 30 ********************************************************************************
ykuroda 0:13a5d365ba16 31 */
ykuroda 0:13a5d365ba16 32
ykuroda 0:13a5d365ba16 33 #ifndef EIGEN_ASSIGN_VML_H
ykuroda 0:13a5d365ba16 34 #define EIGEN_ASSIGN_VML_H
ykuroda 0:13a5d365ba16 35
ykuroda 0:13a5d365ba16 36 namespace Eigen {
ykuroda 0:13a5d365ba16 37
ykuroda 0:13a5d365ba16 38 namespace internal {
ykuroda 0:13a5d365ba16 39
ykuroda 0:13a5d365ba16 40 template<typename Op> struct vml_call
ykuroda 0:13a5d365ba16 41 { enum { IsSupported = 0 }; };
ykuroda 0:13a5d365ba16 42
ykuroda 0:13a5d365ba16 43 template<typename Dst, typename Src, typename UnaryOp>
ykuroda 0:13a5d365ba16 44 class vml_assign_traits
ykuroda 0:13a5d365ba16 45 {
ykuroda 0:13a5d365ba16 46 private:
ykuroda 0:13a5d365ba16 47 enum {
ykuroda 0:13a5d365ba16 48 DstHasDirectAccess = Dst::Flags & DirectAccessBit,
ykuroda 0:13a5d365ba16 49 SrcHasDirectAccess = Src::Flags & DirectAccessBit,
ykuroda 0:13a5d365ba16 50
ykuroda 0:13a5d365ba16 51 StorageOrdersAgree = (int(Dst::IsRowMajor) == int(Src::IsRowMajor)),
ykuroda 0:13a5d365ba16 52 InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime)
ykuroda 0:13a5d365ba16 53 : int(Dst::Flags)&RowMajorBit ? int(Dst::ColsAtCompileTime)
ykuroda 0:13a5d365ba16 54 : int(Dst::RowsAtCompileTime),
ykuroda 0:13a5d365ba16 55 InnerMaxSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime)
ykuroda 0:13a5d365ba16 56 : int(Dst::Flags)&RowMajorBit ? int(Dst::MaxColsAtCompileTime)
ykuroda 0:13a5d365ba16 57 : int(Dst::MaxRowsAtCompileTime),
ykuroda 0:13a5d365ba16 58 MaxSizeAtCompileTime = Dst::SizeAtCompileTime,
ykuroda 0:13a5d365ba16 59
ykuroda 0:13a5d365ba16 60 MightEnableVml = vml_call<UnaryOp>::IsSupported && StorageOrdersAgree && DstHasDirectAccess && SrcHasDirectAccess
ykuroda 0:13a5d365ba16 61 && Src::InnerStrideAtCompileTime==1 && Dst::InnerStrideAtCompileTime==1,
ykuroda 0:13a5d365ba16 62 MightLinearize = MightEnableVml && (int(Dst::Flags) & int(Src::Flags) & LinearAccessBit),
ykuroda 0:13a5d365ba16 63 VmlSize = MightLinearize ? MaxSizeAtCompileTime : InnerMaxSize,
ykuroda 0:13a5d365ba16 64 LargeEnough = VmlSize==Dynamic || VmlSize>=EIGEN_MKL_VML_THRESHOLD,
ykuroda 0:13a5d365ba16 65 MayEnableVml = MightEnableVml && LargeEnough,
ykuroda 0:13a5d365ba16 66 MayLinearize = MayEnableVml && MightLinearize
ykuroda 0:13a5d365ba16 67 };
ykuroda 0:13a5d365ba16 68 public:
ykuroda 0:13a5d365ba16 69 enum {
ykuroda 0:13a5d365ba16 70 Traversal = MayLinearize ? LinearVectorizedTraversal
ykuroda 0:13a5d365ba16 71 : MayEnableVml ? InnerVectorizedTraversal
ykuroda 0:13a5d365ba16 72 : DefaultTraversal
ykuroda 0:13a5d365ba16 73 };
ykuroda 0:13a5d365ba16 74 };
ykuroda 0:13a5d365ba16 75
ykuroda 0:13a5d365ba16 76 template<typename Derived1, typename Derived2, typename UnaryOp, int Traversal, int Unrolling,
ykuroda 0:13a5d365ba16 77 int VmlTraversal = vml_assign_traits<Derived1, Derived2, UnaryOp>::Traversal >
ykuroda 0:13a5d365ba16 78 struct vml_assign_impl
ykuroda 0:13a5d365ba16 79 : assign_impl<Derived1, Eigen::CwiseUnaryOp<UnaryOp, Derived2>,Traversal,Unrolling,BuiltIn>
ykuroda 0:13a5d365ba16 80 {
ykuroda 0:13a5d365ba16 81 };
ykuroda 0:13a5d365ba16 82
ykuroda 0:13a5d365ba16 83 template<typename Derived1, typename Derived2, typename UnaryOp, int Traversal, int Unrolling>
ykuroda 0:13a5d365ba16 84 struct vml_assign_impl<Derived1, Derived2, UnaryOp, Traversal, Unrolling, InnerVectorizedTraversal>
ykuroda 0:13a5d365ba16 85 {
ykuroda 0:13a5d365ba16 86 typedef typename Derived1::Scalar Scalar;
ykuroda 0:13a5d365ba16 87 typedef typename Derived1::Index Index;
ykuroda 0:13a5d365ba16 88 static inline void run(Derived1& dst, const CwiseUnaryOp<UnaryOp, Derived2>& src)
ykuroda 0:13a5d365ba16 89 {
ykuroda 0:13a5d365ba16 90 // in case we want to (or have to) skip VML at runtime we can call:
ykuroda 0:13a5d365ba16 91 // assign_impl<Derived1,Eigen::CwiseUnaryOp<UnaryOp, Derived2>,Traversal,Unrolling,BuiltIn>::run(dst,src);
ykuroda 0:13a5d365ba16 92 const Index innerSize = dst.innerSize();
ykuroda 0:13a5d365ba16 93 const Index outerSize = dst.outerSize();
ykuroda 0:13a5d365ba16 94 for(Index outer = 0; outer < outerSize; ++outer) {
ykuroda 0:13a5d365ba16 95 const Scalar *src_ptr = src.IsRowMajor ? &(src.nestedExpression().coeffRef(outer,0)) :
ykuroda 0:13a5d365ba16 96 &(src.nestedExpression().coeffRef(0, outer));
ykuroda 0:13a5d365ba16 97 Scalar *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer,0)) : &(dst.coeffRef(0, outer));
ykuroda 0:13a5d365ba16 98 vml_call<UnaryOp>::run(src.functor(), innerSize, src_ptr, dst_ptr );
ykuroda 0:13a5d365ba16 99 }
ykuroda 0:13a5d365ba16 100 }
ykuroda 0:13a5d365ba16 101 };
ykuroda 0:13a5d365ba16 102
ykuroda 0:13a5d365ba16 103 template<typename Derived1, typename Derived2, typename UnaryOp, int Traversal, int Unrolling>
ykuroda 0:13a5d365ba16 104 struct vml_assign_impl<Derived1, Derived2, UnaryOp, Traversal, Unrolling, LinearVectorizedTraversal>
ykuroda 0:13a5d365ba16 105 {
ykuroda 0:13a5d365ba16 106 static inline void run(Derived1& dst, const CwiseUnaryOp<UnaryOp, Derived2>& src)
ykuroda 0:13a5d365ba16 107 {
ykuroda 0:13a5d365ba16 108 // in case we want to (or have to) skip VML at runtime we can call:
ykuroda 0:13a5d365ba16 109 // assign_impl<Derived1,Eigen::CwiseUnaryOp<UnaryOp, Derived2>,Traversal,Unrolling,BuiltIn>::run(dst,src);
ykuroda 0:13a5d365ba16 110 vml_call<UnaryOp>::run(src.functor(), dst.size(), src.nestedExpression().data(), dst.data() );
ykuroda 0:13a5d365ba16 111 }
ykuroda 0:13a5d365ba16 112 };
ykuroda 0:13a5d365ba16 113
ykuroda 0:13a5d365ba16 114 // Macroses
ykuroda 0:13a5d365ba16 115
ykuroda 0:13a5d365ba16 116 #define EIGEN_MKL_VML_SPECIALIZE_ASSIGN(TRAVERSAL,UNROLLING) \
ykuroda 0:13a5d365ba16 117 template<typename Derived1, typename Derived2, typename UnaryOp> \
ykuroda 0:13a5d365ba16 118 struct assign_impl<Derived1, Eigen::CwiseUnaryOp<UnaryOp, Derived2>, TRAVERSAL, UNROLLING, Specialized> { \
ykuroda 0:13a5d365ba16 119 static inline void run(Derived1 &dst, const Eigen::CwiseUnaryOp<UnaryOp, Derived2> &src) { \
ykuroda 0:13a5d365ba16 120 vml_assign_impl<Derived1,Derived2,UnaryOp,TRAVERSAL,UNROLLING>::run(dst, src); \
ykuroda 0:13a5d365ba16 121 } \
ykuroda 0:13a5d365ba16 122 };
ykuroda 0:13a5d365ba16 123
ykuroda 0:13a5d365ba16 124 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(DefaultTraversal,NoUnrolling)
ykuroda 0:13a5d365ba16 125 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(DefaultTraversal,CompleteUnrolling)
ykuroda 0:13a5d365ba16 126 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(DefaultTraversal,InnerUnrolling)
ykuroda 0:13a5d365ba16 127 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearTraversal,NoUnrolling)
ykuroda 0:13a5d365ba16 128 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearTraversal,CompleteUnrolling)
ykuroda 0:13a5d365ba16 129 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(InnerVectorizedTraversal,NoUnrolling)
ykuroda 0:13a5d365ba16 130 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(InnerVectorizedTraversal,CompleteUnrolling)
ykuroda 0:13a5d365ba16 131 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(InnerVectorizedTraversal,InnerUnrolling)
ykuroda 0:13a5d365ba16 132 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearVectorizedTraversal,CompleteUnrolling)
ykuroda 0:13a5d365ba16 133 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearVectorizedTraversal,NoUnrolling)
ykuroda 0:13a5d365ba16 134 EIGEN_MKL_VML_SPECIALIZE_ASSIGN(SliceVectorizedTraversal,NoUnrolling)
ykuroda 0:13a5d365ba16 135
ykuroda 0:13a5d365ba16 136
ykuroda 0:13a5d365ba16 137 #if !defined (EIGEN_FAST_MATH) || (EIGEN_FAST_MATH != 1)
ykuroda 0:13a5d365ba16 138 #define EIGEN_MKL_VML_MODE VML_HA
ykuroda 0:13a5d365ba16 139 #else
ykuroda 0:13a5d365ba16 140 #define EIGEN_MKL_VML_MODE VML_LA
ykuroda 0:13a5d365ba16 141 #endif
ykuroda 0:13a5d365ba16 142
ykuroda 0:13a5d365ba16 143 #define EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE) \
ykuroda 0:13a5d365ba16 144 template<> struct vml_call< scalar_##EIGENOP##_op<EIGENTYPE> > { \
ykuroda 0:13a5d365ba16 145 enum { IsSupported = 1 }; \
ykuroda 0:13a5d365ba16 146 static inline void run( const scalar_##EIGENOP##_op<EIGENTYPE>& /*func*/, \
ykuroda 0:13a5d365ba16 147 int size, const EIGENTYPE* src, EIGENTYPE* dst) { \
ykuroda 0:13a5d365ba16 148 VMLOP(size, (const VMLTYPE*)src, (VMLTYPE*)dst); \
ykuroda 0:13a5d365ba16 149 } \
ykuroda 0:13a5d365ba16 150 };
ykuroda 0:13a5d365ba16 151
ykuroda 0:13a5d365ba16 152 #define EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE) \
ykuroda 0:13a5d365ba16 153 template<> struct vml_call< scalar_##EIGENOP##_op<EIGENTYPE> > { \
ykuroda 0:13a5d365ba16 154 enum { IsSupported = 1 }; \
ykuroda 0:13a5d365ba16 155 static inline void run( const scalar_##EIGENOP##_op<EIGENTYPE>& /*func*/, \
ykuroda 0:13a5d365ba16 156 int size, const EIGENTYPE* src, EIGENTYPE* dst) { \
ykuroda 0:13a5d365ba16 157 MKL_INT64 vmlMode = EIGEN_MKL_VML_MODE; \
ykuroda 0:13a5d365ba16 158 VMLOP(size, (const VMLTYPE*)src, (VMLTYPE*)dst, vmlMode); \
ykuroda 0:13a5d365ba16 159 } \
ykuroda 0:13a5d365ba16 160 };
ykuroda 0:13a5d365ba16 161
ykuroda 0:13a5d365ba16 162 #define EIGEN_MKL_VML_DECLARE_POW_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE) \
ykuroda 0:13a5d365ba16 163 template<> struct vml_call< scalar_##EIGENOP##_op<EIGENTYPE> > { \
ykuroda 0:13a5d365ba16 164 enum { IsSupported = 1 }; \
ykuroda 0:13a5d365ba16 165 static inline void run( const scalar_##EIGENOP##_op<EIGENTYPE>& func, \
ykuroda 0:13a5d365ba16 166 int size, const EIGENTYPE* src, EIGENTYPE* dst) { \
ykuroda 0:13a5d365ba16 167 EIGENTYPE exponent = func.m_exponent; \
ykuroda 0:13a5d365ba16 168 MKL_INT64 vmlMode = EIGEN_MKL_VML_MODE; \
ykuroda 0:13a5d365ba16 169 VMLOP(&size, (const VMLTYPE*)src, (const VMLTYPE*)&exponent, \
ykuroda 0:13a5d365ba16 170 (VMLTYPE*)dst, &vmlMode); \
ykuroda 0:13a5d365ba16 171 } \
ykuroda 0:13a5d365ba16 172 };
ykuroda 0:13a5d365ba16 173
ykuroda 0:13a5d365ba16 174 #define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP) \
ykuroda 0:13a5d365ba16 175 EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vs##VMLOP, float, float) \
ykuroda 0:13a5d365ba16 176 EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vd##VMLOP, double, double)
ykuroda 0:13a5d365ba16 177
ykuroda 0:13a5d365ba16 178 #define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX(EIGENOP, VMLOP) \
ykuroda 0:13a5d365ba16 179 EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vc##VMLOP, scomplex, MKL_Complex8) \
ykuroda 0:13a5d365ba16 180 EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vz##VMLOP, dcomplex, MKL_Complex16)
ykuroda 0:13a5d365ba16 181
ykuroda 0:13a5d365ba16 182 #define EIGEN_MKL_VML_DECLARE_UNARY_CALLS(EIGENOP, VMLOP) \
ykuroda 0:13a5d365ba16 183 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP) \
ykuroda 0:13a5d365ba16 184 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX(EIGENOP, VMLOP)
ykuroda 0:13a5d365ba16 185
ykuroda 0:13a5d365ba16 186
ykuroda 0:13a5d365ba16 187 #define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL_LA(EIGENOP, VMLOP) \
ykuroda 0:13a5d365ba16 188 EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vms##VMLOP, float, float) \
ykuroda 0:13a5d365ba16 189 EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vmd##VMLOP, double, double)
ykuroda 0:13a5d365ba16 190
ykuroda 0:13a5d365ba16 191 #define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX_LA(EIGENOP, VMLOP) \
ykuroda 0:13a5d365ba16 192 EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vmc##VMLOP, scomplex, MKL_Complex8) \
ykuroda 0:13a5d365ba16 193 EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vmz##VMLOP, dcomplex, MKL_Complex16)
ykuroda 0:13a5d365ba16 194
ykuroda 0:13a5d365ba16 195 #define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(EIGENOP, VMLOP) \
ykuroda 0:13a5d365ba16 196 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL_LA(EIGENOP, VMLOP) \
ykuroda 0:13a5d365ba16 197 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX_LA(EIGENOP, VMLOP)
ykuroda 0:13a5d365ba16 198
ykuroda 0:13a5d365ba16 199
ykuroda 0:13a5d365ba16 200 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(sin, Sin)
ykuroda 0:13a5d365ba16 201 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(asin, Asin)
ykuroda 0:13a5d365ba16 202 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(cos, Cos)
ykuroda 0:13a5d365ba16 203 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(acos, Acos)
ykuroda 0:13a5d365ba16 204 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(tan, Tan)
ykuroda 0:13a5d365ba16 205 //EIGEN_MKL_VML_DECLARE_UNARY_CALLS(abs, Abs)
ykuroda 0:13a5d365ba16 206 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(exp, Exp)
ykuroda 0:13a5d365ba16 207 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(log, Ln)
ykuroda 0:13a5d365ba16 208 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(sqrt, Sqrt)
ykuroda 0:13a5d365ba16 209
ykuroda 0:13a5d365ba16 210 EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(square, Sqr)
ykuroda 0:13a5d365ba16 211
ykuroda 0:13a5d365ba16 212 // The vm*powx functions are not avaibale in the windows version of MKL.
ykuroda 0:13a5d365ba16 213 #ifndef _WIN32
ykuroda 0:13a5d365ba16 214 EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmspowx_, float, float)
ykuroda 0:13a5d365ba16 215 EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmdpowx_, double, double)
ykuroda 0:13a5d365ba16 216 EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmcpowx_, scomplex, MKL_Complex8)
ykuroda 0:13a5d365ba16 217 EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmzpowx_, dcomplex, MKL_Complex16)
ykuroda 0:13a5d365ba16 218 #endif
ykuroda 0:13a5d365ba16 219
ykuroda 0:13a5d365ba16 220 } // end namespace internal
ykuroda 0:13a5d365ba16 221
ykuroda 0:13a5d365ba16 222 } // end namespace Eigen
ykuroda 0:13a5d365ba16 223
ykuroda 0:13a5d365ba16 224 #endif // EIGEN_ASSIGN_VML_H