mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Merged eigen/eigen into default
This commit is contained in:
0
Eigen/src/Core/AssignEvaluator.h
Executable file → Normal file
0
Eigen/src/Core/AssignEvaluator.h
Executable file → Normal file
0
Eigen/src/Core/Assign_MKL.h
Executable file → Normal file
0
Eigen/src/Core/Assign_MKL.h
Executable file → Normal file
@@ -60,6 +60,23 @@ template<typename T> struct GenericNumTraits
|
||||
MulCost = 1
|
||||
};
|
||||
|
||||
// Division is messy but important, because it is expensive and throughput
|
||||
// varies significantly. The following numbers are based on min division
|
||||
// throughput on Haswell.
|
||||
template<bool Vectorized>
|
||||
struct Div {
|
||||
enum {
|
||||
#ifdef EIGEN_VECTORIZE_AVX
|
||||
AVX = true,
|
||||
#else
|
||||
AVX = false,
|
||||
#endif
|
||||
Cost = IsInteger ? (sizeof(T) == 8 ? (IsSigned ? 24 : 21) : (IsSigned ? 8 : 9)):
|
||||
Vectorized ? (sizeof(T) == 8 ? (AVX ? 16 : 8) : (AVX ? 14 : 7)) : 8
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
typedef T Real;
|
||||
typedef typename internal::conditional<
|
||||
IsInteger,
|
||||
|
||||
0
Eigen/src/Core/ProductEvaluators.h
Executable file → Normal file
0
Eigen/src/Core/ProductEvaluators.h
Executable file → Normal file
@@ -576,7 +576,7 @@ struct igammac_impl {
|
||||
pkm1 = pk;
|
||||
qkm2 = qkm1;
|
||||
qkm1 = qk;
|
||||
if (abs(pk) > big) {
|
||||
if (numext::abs(pk) > big) {
|
||||
pkm2 *= biginv;
|
||||
pkm1 *= biginv;
|
||||
qkm2 *= biginv;
|
||||
|
||||
0
Eigen/src/Core/VectorwiseOp.h
Executable file → Normal file
0
Eigen/src/Core/VectorwiseOp.h
Executable file → Normal file
@@ -63,38 +63,69 @@ static inline EIGEN_DEVICE_FUNC float half_to_float(__half h);
|
||||
|
||||
// Class definition.
|
||||
struct half : public __half {
|
||||
EIGEN_DEVICE_FUNC half() : __half(internal::raw_uint16_to_half(0)) {}
|
||||
EIGEN_DEVICE_FUNC half() {}
|
||||
|
||||
// TODO(sesse): Should these conversions be marked as explicit?
|
||||
EIGEN_DEVICE_FUNC half(float f) : __half(internal::float_to_half_rtne(f)) {}
|
||||
EIGEN_DEVICE_FUNC half(int i) : __half(internal::float_to_half_rtne(static_cast<float>(i))) {}
|
||||
EIGEN_DEVICE_FUNC half(double d) : __half(internal::float_to_half_rtne(static_cast<float>(d))) {}
|
||||
EIGEN_DEVICE_FUNC half(bool b)
|
||||
: __half(internal::raw_uint16_to_half(b ? 0x3c00 : 0)) {}
|
||||
EIGEN_DEVICE_FUNC half(const __half& h) : __half(h) {}
|
||||
EIGEN_DEVICE_FUNC half(const half& h) : __half(h) {}
|
||||
EIGEN_DEVICE_FUNC half(const volatile half& h)
|
||||
: __half(internal::raw_uint16_to_half(h.x)) {}
|
||||
|
||||
explicit EIGEN_DEVICE_FUNC half(bool b)
|
||||
: __half(internal::raw_uint16_to_half(b ? 0x3c00 : 0)) {}
|
||||
explicit EIGEN_DEVICE_FUNC half(int i)
|
||||
: __half(internal::float_to_half_rtne(static_cast<float>(i))) {}
|
||||
explicit EIGEN_DEVICE_FUNC half(long l)
|
||||
: __half(internal::float_to_half_rtne(static_cast<float>(l))) {}
|
||||
explicit EIGEN_DEVICE_FUNC half(long long ll)
|
||||
: __half(internal::float_to_half_rtne(static_cast<float>(ll))) {}
|
||||
explicit EIGEN_DEVICE_FUNC half(float f)
|
||||
: __half(internal::float_to_half_rtne(f)) {}
|
||||
explicit EIGEN_DEVICE_FUNC half(double d)
|
||||
: __half(internal::float_to_half_rtne(static_cast<float>(d))) {}
|
||||
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(bool) const {
|
||||
// +0.0 and -0.0 become false, everything else becomes true.
|
||||
return static_cast<bool>(x & 0x7fff);
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(signed char) const {
|
||||
return static_cast<signed char>(internal::half_to_float(*this));
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned char) const {
|
||||
return static_cast<unsigned char>(internal::half_to_float(*this));
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(short) const {
|
||||
return static_cast<short>(internal::half_to_float(*this));
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned short) const {
|
||||
return static_cast<unsigned short>(internal::half_to_float(*this));
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(int) const {
|
||||
return static_cast<int>(internal::half_to_float(*this));
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned int) const {
|
||||
return static_cast<unsigned int>(internal::half_to_float(*this));
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(long) const {
|
||||
return static_cast<long>(internal::half_to_float(*this));
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned long) const {
|
||||
return static_cast<unsigned long>(internal::half_to_float(*this));
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(long long) const {
|
||||
return static_cast<long long>(internal::half_to_float(*this));
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(unsigned long long) const {
|
||||
return static_cast<unsigned long long>(internal::half_to_float(*this));
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(float) const {
|
||||
return internal::half_to_float(*this);
|
||||
}
|
||||
EIGEN_DEVICE_FUNC EIGEN_EXPLICIT_CAST(double) const {
|
||||
return internal::half_to_float(*this);
|
||||
return static_cast<double>(internal::half_to_float(*this));
|
||||
}
|
||||
|
||||
EIGEN_DEVICE_FUNC half& operator=(const half& other) {
|
||||
x = other.x;
|
||||
return *this;
|
||||
}
|
||||
EIGEN_DEVICE_FUNC half& operator=(const volatile half& other) {
|
||||
x = other.x;
|
||||
return *this;
|
||||
}
|
||||
EIGEN_DEVICE_FUNC volatile half& operator=(const half& other) volatile {
|
||||
x = other.x;
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
|
||||
#if defined(EIGEN_HAS_CUDA_FP16) && defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 530
|
||||
@@ -203,6 +234,12 @@ static inline EIGEN_DEVICE_FUNC bool operator > (const half& a, const half& b) {
|
||||
|
||||
#endif // Emulate support for half floats
|
||||
|
||||
// Division by an index. Do it in full float precision to avoid accuracy
|
||||
// issues in converting the denominator to half.
|
||||
static inline EIGEN_DEVICE_FUNC half operator / (const half& a, Index b) {
|
||||
return Eigen::half(static_cast<float>(a) / static_cast<float>(b));
|
||||
}
|
||||
|
||||
// Conversion routines, including fallbacks for the host or older CUDA.
|
||||
// Note that newer Intel CPUs (Haswell or newer) have vectorized versions of
|
||||
// these in hardware. If we need more performance on older/other CPUs, they are
|
||||
@@ -341,4 +378,14 @@ static inline EIGEN_DEVICE_FUNC Eigen::half log(const Eigen::half& a) {
|
||||
|
||||
} // end namespace std
|
||||
|
||||
|
||||
// Add the missing shfl_xor intrinsic
|
||||
#if defined(EIGEN_HAS_CUDA_FP16) && defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 300
|
||||
__device__ inline Eigen::half __shfl_xor(Eigen::half var, int laneMask, int width=warpSize) {
|
||||
return static_cast<Eigen::half>(__shfl_xor(static_cast<float>(var), laneMask, width));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
#endif // EIGEN_HALF_CUDA_H
|
||||
|
||||
@@ -114,8 +114,8 @@ template<> EIGEN_STRONG_INLINE half2 pcast<float4, half2>(const float4& a) {
|
||||
#if defined(__CUDA_ARCH__) && __CUDA_ARCH__ >= 300
|
||||
return __float22half2_rn(make_float2(a.x, a.y));
|
||||
#else
|
||||
half r1 = a.x;
|
||||
half r2 = a.y;
|
||||
half r1 = static_cast<half>(a.x);
|
||||
half r2 = static_cast<half>(a.y);
|
||||
half2 r;
|
||||
r.x = 0;
|
||||
r.x |= r1.x;
|
||||
|
||||
@@ -238,7 +238,13 @@ template<typename Scalar> struct scalar_hypot_op {
|
||||
};
|
||||
template<typename Scalar>
|
||||
struct functor_traits<scalar_hypot_op<Scalar> > {
|
||||
enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess=0 };
|
||||
enum
|
||||
{
|
||||
Cost = 3 * NumTraits<Scalar>::AddCost +
|
||||
2 * NumTraits<Scalar>::MulCost +
|
||||
2 * NumTraits<Scalar>::template Div<false>::Cost,
|
||||
PacketAccess = false
|
||||
};
|
||||
};
|
||||
|
||||
/** \internal
|
||||
@@ -297,9 +303,10 @@ template<typename LhsScalar,typename RhsScalar> struct scalar_quotient_op {
|
||||
};
|
||||
template<typename LhsScalar,typename RhsScalar>
|
||||
struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
|
||||
typedef typename scalar_quotient_op<LhsScalar,RhsScalar>::result_type result_type;
|
||||
enum {
|
||||
Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost), // rough estimate!
|
||||
PacketAccess = scalar_quotient_op<LhsScalar,RhsScalar>::Vectorizable
|
||||
PacketAccess = scalar_quotient_op<LhsScalar,RhsScalar>::Vectorizable,
|
||||
Cost = NumTraits<result_type>::template Div<PacketAccess>::Cost
|
||||
};
|
||||
};
|
||||
|
||||
@@ -564,6 +571,10 @@ struct scalar_inverse_mult_op {
|
||||
{ return internal::pdiv(pset1<Packet>(m_other),a); }
|
||||
Scalar m_other;
|
||||
};
|
||||
template<typename Scalar>
|
||||
struct functor_traits<scalar_inverse_mult_op<Scalar> >
|
||||
{ enum { PacketAccess = packet_traits<Scalar>::HasDiv, Cost = NumTraits<Scalar>::template Div<PacketAccess>::Cost }; };
|
||||
|
||||
|
||||
} // end namespace internal
|
||||
|
||||
|
||||
0
Eigen/src/Core/products/GeneralMatrixVector_MKL.h
Executable file → Normal file
0
Eigen/src/Core/products/GeneralMatrixVector_MKL.h
Executable file → Normal file
0
Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h
Executable file → Normal file
0
Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h
Executable file → Normal file
0
Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h
Executable file → Normal file
0
Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h
Executable file → Normal file
0
Eigen/src/Eigenvalues/ComplexSchur_MKL.h
Executable file → Normal file
0
Eigen/src/Eigenvalues/ComplexSchur_MKL.h
Executable file → Normal file
0
Eigen/src/Eigenvalues/GeneralizedEigenSolver.h
Executable file → Normal file
0
Eigen/src/Eigenvalues/GeneralizedEigenSolver.h
Executable file → Normal file
0
Eigen/src/Eigenvalues/RealQZ.h
Executable file → Normal file
0
Eigen/src/Eigenvalues/RealQZ.h
Executable file → Normal file
0
Eigen/src/Eigenvalues/RealSchur_MKL.h
Executable file → Normal file
0
Eigen/src/Eigenvalues/RealSchur_MKL.h
Executable file → Normal file
0
Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h
Executable file → Normal file
0
Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h
Executable file → Normal file
0
Eigen/src/PardisoSupport/PardisoSupport.h
Executable file → Normal file
0
Eigen/src/PardisoSupport/PardisoSupport.h
Executable file → Normal file
0
Eigen/src/QR/ColPivHouseholderQR_MKL.h
Executable file → Normal file
0
Eigen/src/QR/ColPivHouseholderQR_MKL.h
Executable file → Normal file
0
Eigen/src/SVD/JacobiSVD.h
Executable file → Normal file
0
Eigen/src/SVD/JacobiSVD.h
Executable file → Normal file
0
Eigen/src/SparseLU/SparseLU.h
Executable file → Normal file
0
Eigen/src/SparseLU/SparseLU.h
Executable file → Normal file
Reference in New Issue
Block a user