Extend CUDA support to matrix inversion and selfadjointeigensolver

This commit is contained in:
Andrea Bocci 2018-06-11 18:33:24 +02:00
parent 0537123953
commit f7124b3e46
27 changed files with 200 additions and 74 deletions

View File

@ -45,9 +45,10 @@
#ifdef EIGEN_EXCEPTIONS #ifdef EIGEN_EXCEPTIONS
#undef EIGEN_EXCEPTIONS #undef EIGEN_EXCEPTIONS
#endif #endif
#endif
// All functions callable from CUDA code must be qualified with __device__ // All functions callable from CUDA code must be qualified with __device__
#ifdef EIGEN_CUDACC #ifdef EIGEN_CUDACC
// Do not try to vectorize on CUDA and SYCL! // Do not try to vectorize on CUDA and SYCL!
#ifndef EIGEN_DONT_VECTORIZE #ifndef EIGEN_DONT_VECTORIZE
#define EIGEN_DONT_VECTORIZE #define EIGEN_DONT_VECTORIZE
@ -57,15 +58,27 @@
// We need cuda_runtime.h to ensure that that EIGEN_USING_STD_MATH macro // We need cuda_runtime.h to ensure that that EIGEN_USING_STD_MATH macro
// works properly on the device side // works properly on the device side
#include <cuda_runtime.h> #include <cuda_runtime.h>
#else
#define EIGEN_DEVICE_FUNC #if EIGEN_HAS_CONSTEXPR
// While available already with c++11, this is useful mostly starting with c++14 and relaxed constexpr rules
#if defined(__NVCC__)
// nvcc considers constexpr functions as __host__ __device__ with the option --expt-relaxed-constexpr
#ifdef __CUDACC_RELAXED_CONSTEXPR__
#define EIGEN_CONSTEXPR_ARE_DEVICE_FUNC
#endif
#elif defined(__clang__) && defined(__CUDA__)
// clang++ always considers constexpr functions as implicitly __host__ __device__
#define EIGEN_CONSTEXPR_ARE_DEVICE_FUNC
#endif
#endif #endif
#else #else
#define EIGEN_DEVICE_FUNC #define EIGEN_DEVICE_FUNC
#endif #endif
#ifdef __NVCC__ #ifdef __NVCC__
#define EIGEN_DONT_VECTORIZE #ifndef EIGEN_DONT_VECTORIZE
#define EIGEN_DONT_VECTORIZE
#endif
#endif #endif
// When compiling CUDA device code with NVCC, pull in math functions from the // When compiling CUDA device code with NVCC, pull in math functions from the

0
Eigen/PardisoSupport Executable file → Normal file
View File

View File

@ -207,7 +207,9 @@ template<typename T, int Size, int _Rows, int _Cols, int _Options> class DenseSt
EIGEN_UNUSED_VARIABLE(rows); EIGEN_UNUSED_VARIABLE(rows);
EIGEN_UNUSED_VARIABLE(cols); EIGEN_UNUSED_VARIABLE(cols);
} }
EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); } EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
numext::swap(m_data, other.m_data);
}
EIGEN_DEVICE_FUNC static Index rows(void) {return _Rows;} EIGEN_DEVICE_FUNC static Index rows(void) {return _Rows;}
EIGEN_DEVICE_FUNC static Index cols(void) {return _Cols;} EIGEN_DEVICE_FUNC static Index cols(void) {return _Cols;}
EIGEN_DEVICE_FUNC void conservativeResize(Index,Index,Index) {} EIGEN_DEVICE_FUNC void conservativeResize(Index,Index,Index) {}
@ -267,7 +269,11 @@ template<typename T, int Size, int _Options> class DenseStorage<T, Size, Dynamic
} }
EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index cols) : m_rows(rows), m_cols(cols) {} EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index cols) : m_rows(rows), m_cols(cols) {}
EIGEN_DEVICE_FUNC void swap(DenseStorage& other) EIGEN_DEVICE_FUNC void swap(DenseStorage& other)
{ std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); } {
numext::swap(m_data,other.m_data);
numext::swap(m_rows,other.m_rows);
numext::swap(m_cols,other.m_cols);
}
EIGEN_DEVICE_FUNC Index rows() const {return m_rows;} EIGEN_DEVICE_FUNC Index rows() const {return m_rows;}
EIGEN_DEVICE_FUNC Index cols() const {return m_cols;} EIGEN_DEVICE_FUNC Index cols() const {return m_cols;}
EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index cols) { m_rows = rows; m_cols = cols; } EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index cols) { m_rows = rows; m_cols = cols; }
@ -296,7 +302,11 @@ template<typename T, int Size, int _Cols, int _Options> class DenseStorage<T, Si
return *this; return *this;
} }
EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index) : m_rows(rows) {} EIGEN_DEVICE_FUNC DenseStorage(Index, Index rows, Index) : m_rows(rows) {}
EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); } EIGEN_DEVICE_FUNC void swap(DenseStorage& other)
{
numext::swap(m_data,other.m_data);
numext::swap(m_rows,other.m_rows);
}
EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;} EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;}
EIGEN_DEVICE_FUNC Index cols(void) const {return _Cols;} EIGEN_DEVICE_FUNC Index cols(void) const {return _Cols;}
EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index) { m_rows = rows; } EIGEN_DEVICE_FUNC void conservativeResize(Index, Index rows, Index) { m_rows = rows; }
@ -325,11 +335,14 @@ template<typename T, int Size, int _Rows, int _Options> class DenseStorage<T, Si
return *this; return *this;
} }
EIGEN_DEVICE_FUNC DenseStorage(Index, Index, Index cols) : m_cols(cols) {} EIGEN_DEVICE_FUNC DenseStorage(Index, Index, Index cols) : m_cols(cols) {}
EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); } EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
numext::swap(m_data,other.m_data);
numext::swap(m_cols,other.m_cols);
}
EIGEN_DEVICE_FUNC Index rows(void) const {return _Rows;} EIGEN_DEVICE_FUNC Index rows(void) const {return _Rows;}
EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;} EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;}
void conservativeResize(Index, Index, Index cols) { m_cols = cols; } EIGEN_DEVICE_FUNC void conservativeResize(Index, Index, Index cols) { m_cols = cols; }
void resize(Index, Index, Index cols) { m_cols = cols; } EIGEN_DEVICE_FUNC void resize(Index, Index, Index cols) { m_cols = cols; }
EIGEN_DEVICE_FUNC const T *data() const { return m_data.array; } EIGEN_DEVICE_FUNC const T *data() const { return m_data.array; }
EIGEN_DEVICE_FUNC T *data() { return m_data.array; } EIGEN_DEVICE_FUNC T *data() { return m_data.array; }
}; };
@ -381,16 +394,19 @@ template<typename T, int _Options> class DenseStorage<T, Dynamic, Dynamic, Dynam
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT
{ {
using std::swap; numext::swap(m_data, other.m_data);
swap(m_data, other.m_data); numext::swap(m_rows, other.m_rows);
swap(m_rows, other.m_rows); numext::swap(m_cols, other.m_cols);
swap(m_cols, other.m_cols);
return *this; return *this;
} }
#endif #endif
EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols); } EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols); }
EIGEN_DEVICE_FUNC void swap(DenseStorage& other) EIGEN_DEVICE_FUNC void swap(DenseStorage& other)
{ std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); } {
numext::swap(m_data,other.m_data);
numext::swap(m_rows,other.m_rows);
numext::swap(m_cols,other.m_cols);
}
EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;} EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;}
EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;} EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;}
void conservativeResize(Index size, Index rows, Index cols) void conservativeResize(Index size, Index rows, Index cols)
@ -459,14 +475,16 @@ template<typename T, int _Rows, int _Options> class DenseStorage<T, Dynamic, _Ro
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT
{ {
using std::swap; numext::swap(m_data, other.m_data);
swap(m_data, other.m_data); numext::swap(m_cols, other.m_cols);
swap(m_cols, other.m_cols);
return *this; return *this;
} }
#endif #endif
EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols); } EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols); }
EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); } EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
numext::swap(m_data,other.m_data);
numext::swap(m_cols,other.m_cols);
}
EIGEN_DEVICE_FUNC static Index rows(void) {return _Rows;} EIGEN_DEVICE_FUNC static Index rows(void) {return _Rows;}
EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;} EIGEN_DEVICE_FUNC Index cols(void) const {return m_cols;}
EIGEN_DEVICE_FUNC void conservativeResize(Index size, Index, Index cols) EIGEN_DEVICE_FUNC void conservativeResize(Index size, Index, Index cols)
@ -533,14 +551,16 @@ template<typename T, int _Cols, int _Options> class DenseStorage<T, Dynamic, Dyn
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT DenseStorage& operator=(DenseStorage&& other) EIGEN_NOEXCEPT
{ {
using std::swap; numext::swap(m_data, other.m_data);
swap(m_data, other.m_data); numext::swap(m_rows, other.m_rows);
swap(m_rows, other.m_rows);
return *this; return *this;
} }
#endif #endif
EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows); } EIGEN_DEVICE_FUNC ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows); }
EIGEN_DEVICE_FUNC void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); } EIGEN_DEVICE_FUNC void swap(DenseStorage& other) {
numext::swap(m_data,other.m_data);
numext::swap(m_rows,other.m_rows);
}
EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;} EIGEN_DEVICE_FUNC Index rows(void) const {return m_rows;}
EIGEN_DEVICE_FUNC static Index cols(void) {return _Cols;} EIGEN_DEVICE_FUNC static Index cols(void) {return _Cols;}
void conservativeResize(Index size, Index rows, Index) void conservativeResize(Index size, Index rows, Index)

View File

@ -163,13 +163,13 @@ template<typename Scalar,int Size,int MaxSize,bool Cond> struct gemv_static_vect
template<typename Scalar,int Size,int MaxSize> template<typename Scalar,int Size,int MaxSize>
struct gemv_static_vector_if<Scalar,Size,MaxSize,false> struct gemv_static_vector_if<Scalar,Size,MaxSize,false>
{ {
EIGEN_STRONG_INLINE Scalar* data() { eigen_internal_assert(false && "should never be called"); return 0; } EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Scalar* data() { eigen_internal_assert(false && "should never be called"); return 0; }
}; };
template<typename Scalar,int Size> template<typename Scalar,int Size>
struct gemv_static_vector_if<Scalar,Size,Dynamic,true> struct gemv_static_vector_if<Scalar,Size,Dynamic,true>
{ {
EIGEN_STRONG_INLINE Scalar* data() { return 0; } EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Scalar* data() { return 0; }
}; };
template<typename Scalar,int Size,int MaxSize> template<typename Scalar,int Size,int MaxSize>

View File

@ -864,7 +864,7 @@ template<typename T> T generic_fast_tanh_float(const T& a_x);
namespace numext { namespace numext {
#if !defined(EIGEN_CUDA_ARCH) && !defined(__SYCL_DEVICE_ONLY__) #if (!defined(EIGEN_CUDACC) || defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC)) && !defined(__SYCL_DEVICE_ONLY__)
template<typename T> template<typename T>
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y)
@ -881,19 +881,16 @@ EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y)
return max EIGEN_NOT_A_MACRO (x,y); return max EIGEN_NOT_A_MACRO (x,y);
} }
#elif defined(__SYCL_DEVICE_ONLY__) #elif defined(__SYCL_DEVICE_ONLY__)
template<typename T> template<typename T>
EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y) EIGEN_ALWAYS_INLINE T mini(const T& x, const T& y)
{ {
return y < x ? y : x; return y < x ? y : x;
} }
template<typename T> template<typename T>
EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y)
{ {
return x < y ? y : x; return x < y ? y : x;
} }
@ -937,7 +934,6 @@ EIGEN_ALWAYS_INLINE unsigned long maxi(const unsigned long& x, const unsigned lo
return cl::sycl::max(x,y); return cl::sycl::max(x,y);
} }
EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y) EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y)
{ {
return cl::sycl::fmin(x,y); return cl::sycl::fmin(x,y);
@ -971,6 +967,19 @@ EIGEN_ALWAYS_INLINE float mini(const float& x, const float& y)
{ {
return fminf(x, y); return fminf(x, y);
} }
template<>
EIGEN_DEVICE_FUNC
EIGEN_ALWAYS_INLINE double mini(const double& x, const double& y)
{
return fmin(x, y);
}
template<>
EIGEN_DEVICE_FUNC
EIGEN_ALWAYS_INLINE long double mini(const long double& x, const long double& y)
{
return fminl(x, y);
}
template<typename T> template<typename T>
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y) EIGEN_ALWAYS_INLINE T maxi(const T& x, const T& y)
@ -983,6 +992,18 @@ EIGEN_ALWAYS_INLINE float maxi(const float& x, const float& y)
{ {
return fmaxf(x, y); return fmaxf(x, y);
} }
template<>
EIGEN_DEVICE_FUNC
EIGEN_ALWAYS_INLINE double maxi(const double& x, const double& y)
{
return fmax(x, y);
}
template<>
EIGEN_DEVICE_FUNC
EIGEN_ALWAYS_INLINE long double maxi(const long double& x, const long double& y)
{
return fmaxl(x, y);
}
#endif #endif

View File

@ -67,7 +67,7 @@ T generic_fast_tanh_float(const T& a_x)
} }
template<typename RealScalar> template<typename RealScalar>
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
RealScalar positive_real_hypot(const RealScalar& x, const RealScalar& y) RealScalar positive_real_hypot(const RealScalar& x, const RealScalar& y)
{ {
EIGEN_USING_STD_MATH(sqrt); EIGEN_USING_STD_MATH(sqrt);
@ -82,7 +82,8 @@ template<typename Scalar>
struct hypot_impl struct hypot_impl
{ {
typedef typename NumTraits<Scalar>::Real RealScalar; typedef typename NumTraits<Scalar>::Real RealScalar;
static inline RealScalar run(const Scalar& x, const Scalar& y) static EIGEN_DEVICE_FUNC
inline RealScalar run(const Scalar& x, const Scalar& y)
{ {
EIGEN_USING_STD_MATH(abs); EIGEN_USING_STD_MATH(abs);
return positive_real_hypot<RealScalar>(abs(x), abs(y)); return positive_real_hypot<RealScalar>(abs(x), abs(y));

View File

@ -328,6 +328,7 @@ template<typename Derived> class MatrixBase
inline const PartialPivLU<PlainObject> lu() const; inline const PartialPivLU<PlainObject> lu() const;
EIGEN_DEVICE_FUNC
inline const Inverse<Derived> inverse() const; inline const Inverse<Derived> inverse() const;
template<typename ResultType> template<typename ResultType>
@ -337,12 +338,15 @@ template<typename Derived> class MatrixBase
bool& invertible, bool& invertible,
const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision() const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()
) const; ) const;
template<typename ResultType> template<typename ResultType>
inline void computeInverseWithCheck( inline void computeInverseWithCheck(
ResultType& inverse, ResultType& inverse,
bool& invertible, bool& invertible,
const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision() const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()
) const; ) const;
EIGEN_DEVICE_FUNC
Scalar determinant() const; Scalar determinant() const;
/////////// Cholesky module /////////// /////////// Cholesky module ///////////
@ -414,15 +418,19 @@ template<typename Derived> class MatrixBase
////////// Householder module /////////// ////////// Householder module ///////////
EIGEN_DEVICE_FUNC
void makeHouseholderInPlace(Scalar& tau, RealScalar& beta); void makeHouseholderInPlace(Scalar& tau, RealScalar& beta);
template<typename EssentialPart> template<typename EssentialPart>
EIGEN_DEVICE_FUNC
void makeHouseholder(EssentialPart& essential, void makeHouseholder(EssentialPart& essential,
Scalar& tau, RealScalar& beta) const; Scalar& tau, RealScalar& beta) const;
template<typename EssentialPart> template<typename EssentialPart>
EIGEN_DEVICE_FUNC
void applyHouseholderOnTheLeft(const EssentialPart& essential, void applyHouseholderOnTheLeft(const EssentialPart& essential,
const Scalar& tau, const Scalar& tau,
Scalar* workspace); Scalar* workspace);
template<typename EssentialPart> template<typename EssentialPart>
EIGEN_DEVICE_FUNC
void applyHouseholderOnTheRight(const EssentialPart& essential, void applyHouseholderOnTheRight(const EssentialPart& essential,
const Scalar& tau, const Scalar& tau,
Scalar* workspace); Scalar* workspace);

View File

@ -21,12 +21,14 @@ template< typename T,
bool is_integer = NumTraits<T>::IsInteger> bool is_integer = NumTraits<T>::IsInteger>
struct default_digits10_impl struct default_digits10_impl
{ {
EIGEN_DEVICE_FUNC
static int run() { return std::numeric_limits<T>::digits10; } static int run() { return std::numeric_limits<T>::digits10; }
}; };
template<typename T> template<typename T>
struct default_digits10_impl<T,false,false> // Floating point struct default_digits10_impl<T,false,false> // Floating point
{ {
EIGEN_DEVICE_FUNC
static int run() { static int run() {
using std::log10; using std::log10;
using std::ceil; using std::ceil;
@ -38,6 +40,7 @@ struct default_digits10_impl<T,false,false> // Floating point
template<typename T> template<typename T>
struct default_digits10_impl<T,false,true> // Integer struct default_digits10_impl<T,false,true> // Integer
{ {
EIGEN_DEVICE_FUNC
static int run() { return 0; } static int run() { return 0; }
}; };
@ -49,12 +52,14 @@ template< typename T,
bool is_integer = NumTraits<T>::IsInteger> bool is_integer = NumTraits<T>::IsInteger>
struct default_digits_impl struct default_digits_impl
{ {
EIGEN_DEVICE_FUNC
static int run() { return std::numeric_limits<T>::digits; } static int run() { return std::numeric_limits<T>::digits; }
}; };
template<typename T> template<typename T>
struct default_digits_impl<T,false,false> // Floating point struct default_digits_impl<T,false,false> // Floating point
{ {
EIGEN_DEVICE_FUNC
static int run() { static int run() {
using std::log; using std::log;
using std::ceil; using std::ceil;
@ -66,6 +71,7 @@ struct default_digits_impl<T,false,false> // Floating point
template<typename T> template<typename T>
struct default_digits_impl<T,false,true> // Integer struct default_digits_impl<T,false,true> // Integer
{ {
EIGEN_DEVICE_FUNC
static int run() { return 0; } static int run() { return 0; }
}; };

View File

@ -99,13 +99,13 @@ class PermutationBase : public EigenBase<Derived>
#endif #endif
/** \returns the number of rows */ /** \returns the number of rows */
inline Index rows() const { return Index(indices().size()); } inline EIGEN_DEVICE_FUNC Index rows() const { return Index(indices().size()); }
/** \returns the number of columns */ /** \returns the number of columns */
inline Index cols() const { return Index(indices().size()); } inline EIGEN_DEVICE_FUNC Index cols() const { return Index(indices().size()); }
/** \returns the size of a side of the respective square matrix, i.e., the number of indices */ /** \returns the size of a side of the respective square matrix, i.e., the number of indices */
inline Index size() const { return Index(indices().size()); } inline EIGEN_DEVICE_FUNC Index size() const { return Index(indices().size()); }
#ifndef EIGEN_PARSED_BY_DOXYGEN #ifndef EIGEN_PARSED_BY_DOXYGEN
template<typename DenseDerived> template<typename DenseDerived>

View File

@ -127,7 +127,7 @@ public:
using Base::derived; using Base::derived;
typedef typename Base::Scalar Scalar; typedef typename Base::Scalar Scalar;
EIGEN_STRONG_INLINE operator const Scalar() const EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE operator const Scalar() const
{ {
return internal::evaluator<ProductXpr>(derived()).coeff(0,0); return internal::evaluator<ProductXpr>(derived()).coeff(0,0);
} }

View File

@ -767,7 +767,8 @@ struct generic_product_impl<Lhs,Rhs,SelfAdjointShape,DenseShape,ProductTag>
typedef typename Product<Lhs,Rhs>::Scalar Scalar; typedef typename Product<Lhs,Rhs>::Scalar Scalar;
template<typename Dest> template<typename Dest>
static void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha) static EIGEN_DEVICE_FUNC
void scaleAndAddTo(Dest& dst, const Lhs& lhs, const Rhs& rhs, const Scalar& alpha)
{ {
selfadjoint_product_impl<typename Lhs::MatrixType,Lhs::Mode,false,Rhs,0,Rhs::IsVectorAtCompileTime>::run(dst, lhs.nestedExpression(), rhs, alpha); selfadjoint_product_impl<typename Lhs::MatrixType,Lhs::Mode,false,Rhs,0,Rhs::IsVectorAtCompileTime>::run(dst, lhs.nestedExpression(), rhs, alpha);
} }

View File

@ -79,6 +79,7 @@ template<typename MatrixType> class Transpose
nestedExpression() { return m_matrix; } nestedExpression() { return m_matrix; }
/** \internal */ /** \internal */
EIGEN_DEVICE_FUNC
void resize(Index nrows, Index ncols) { void resize(Index nrows, Index ncols) {
m_matrix.resize(ncols,nrows); m_matrix.resize(ncols,nrows);
} }

View File

@ -65,6 +65,7 @@ template<typename Derived> class TriangularBase : public EigenBase<Derived>
inline Index innerStride() const { return derived().innerStride(); } inline Index innerStride() const { return derived().innerStride(); }
// dummy resize function // dummy resize function
EIGEN_DEVICE_FUNC
void resize(Index rows, Index cols) void resize(Index rows, Index cols)
{ {
EIGEN_UNUSED_VARIABLE(rows); EIGEN_UNUSED_VARIABLE(rows);
@ -716,6 +717,7 @@ struct unary_evaluator<TriangularView<MatrixType,Mode>, IndexBased>
{ {
typedef TriangularView<MatrixType,Mode> XprType; typedef TriangularView<MatrixType,Mode> XprType;
typedef evaluator<typename internal::remove_all<MatrixType>::type> Base; typedef evaluator<typename internal::remove_all<MatrixType>::type> Base;
EIGEN_DEVICE_FUNC
unary_evaluator(const XprType &xpr) : Base(xpr.nestedExpression()) {} unary_evaluator(const XprType &xpr) : Base(xpr.nestedExpression()) {}
}; };

View File

@ -27,7 +27,8 @@ template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool Conju
struct selfadjoint_matrix_vector_product struct selfadjoint_matrix_vector_product
{ {
static EIGEN_DONT_INLINE void run( static EIGEN_DONT_INLINE EIGEN_DEVICE_FUNC
void run(
Index size, Index size,
const Scalar* lhs, Index lhsStride, const Scalar* lhs, Index lhsStride,
const Scalar* rhs, const Scalar* rhs,
@ -36,7 +37,8 @@ static EIGEN_DONT_INLINE void run(
}; };
template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version> template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version>
EIGEN_DONT_INLINE void selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Version>::run( EIGEN_DONT_INLINE EIGEN_DEVICE_FUNC
void selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Version>::run(
Index size, Index size,
const Scalar* lhs, Index lhsStride, const Scalar* lhs, Index lhsStride,
const Scalar* rhs, const Scalar* rhs,
@ -62,8 +64,7 @@ EIGEN_DONT_INLINE void selfadjoint_matrix_vector_product<Scalar,Index,StorageOrd
Scalar cjAlpha = ConjugateRhs ? numext::conj(alpha) : alpha; Scalar cjAlpha = ConjugateRhs ? numext::conj(alpha) : alpha;
Index bound = numext::maxi(Index(0), size-8) & 0xfffffffe;
Index bound = (std::max)(Index(0),size-8) & 0xfffffffe;
if (FirstTriangular) if (FirstTriangular)
bound = size - bound; bound = size - bound;
@ -175,7 +176,8 @@ struct selfadjoint_product_impl<Lhs,LhsMode,false,Rhs,0,true>
enum { LhsUpLo = LhsMode&(Upper|Lower) }; enum { LhsUpLo = LhsMode&(Upper|Lower) };
template<typename Dest> template<typename Dest>
static void run(Dest& dest, const Lhs &a_lhs, const Rhs &a_rhs, const Scalar& alpha) static EIGEN_DEVICE_FUNC
void run(Dest& dest, const Lhs &a_lhs, const Rhs &a_rhs, const Scalar& alpha)
{ {
typedef typename Dest::Scalar ResScalar; typedef typename Dest::Scalar ResScalar;
typedef typename Rhs::Scalar RhsScalar; typedef typename Rhs::Scalar RhsScalar;

View File

@ -24,7 +24,8 @@ struct selfadjoint_rank2_update_selector;
template<typename Scalar, typename Index, typename UType, typename VType> template<typename Scalar, typename Index, typename UType, typename VType>
struct selfadjoint_rank2_update_selector<Scalar,Index,UType,VType,Lower> struct selfadjoint_rank2_update_selector<Scalar,Index,UType,VType,Lower>
{ {
static void run(Scalar* mat, Index stride, const UType& u, const VType& v, const Scalar& alpha) static EIGEN_DEVICE_FUNC
void run(Scalar* mat, Index stride, const UType& u, const VType& v, const Scalar& alpha)
{ {
const Index size = u.size(); const Index size = u.size();
for (Index i=0; i<size; ++i) for (Index i=0; i<size; ++i)

View File

@ -289,8 +289,8 @@ template<typename XprType> struct blas_traits
ExtractType, ExtractType,
typename _ExtractType::PlainObject typename _ExtractType::PlainObject
>::type DirectLinearAccessType; >::type DirectLinearAccessType;
static inline ExtractType extract(const XprType& x) { return x; } static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) { return x; }
static inline const Scalar extractScalarFactor(const XprType&) { return Scalar(1); } static inline EIGEN_DEVICE_FUNC const Scalar extractScalarFactor(const XprType&) { return Scalar(1); }
}; };
// pop conjugate // pop conjugate
@ -318,8 +318,8 @@ struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp
typedef blas_traits<NestedXpr> Base; typedef blas_traits<NestedXpr> Base;
typedef CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr> XprType; typedef CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr> XprType;
typedef typename Base::ExtractType ExtractType; typedef typename Base::ExtractType ExtractType;
static inline ExtractType extract(const XprType& x) { return Base::extract(x.rhs()); } static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) { return Base::extract(x.rhs()); }
static inline Scalar extractScalarFactor(const XprType& x) static inline EIGEN_DEVICE_FUNC Scalar extractScalarFactor(const XprType& x)
{ return x.lhs().functor().m_other * Base::extractScalarFactor(x.rhs()); } { return x.lhs().functor().m_other * Base::extractScalarFactor(x.rhs()); }
}; };
template<typename Scalar, typename NestedXpr, typename Plain> template<typename Scalar, typename NestedXpr, typename Plain>

View File

@ -542,7 +542,7 @@ template<typename T> struct smart_memmove_helper<T,false> {
// you can overwrite Eigen's default behavior regarding alloca by defining EIGEN_ALLOCA // you can overwrite Eigen's default behavior regarding alloca by defining EIGEN_ALLOCA
// to the appropriate stack allocation function // to the appropriate stack allocation function
#ifndef EIGEN_ALLOCA #if ! defined EIGEN_ALLOCA && ! defined EIGEN_CUDA_ARCH
#if EIGEN_OS_LINUX || EIGEN_OS_MAC || (defined alloca) #if EIGEN_OS_LINUX || EIGEN_OS_MAC || (defined alloca)
#define EIGEN_ALLOCA alloca #define EIGEN_ALLOCA alloca
#elif EIGEN_COMP_MSVC #elif EIGEN_COMP_MSVC
@ -561,12 +561,14 @@ template<typename T> class aligned_stack_memory_handler : noncopyable
* In this case, the buffer elements will also be destructed when this handler will be destructed. * In this case, the buffer elements will also be destructed when this handler will be destructed.
* Finally, if \a dealloc is true, then the pointer \a ptr is freed. * Finally, if \a dealloc is true, then the pointer \a ptr is freed.
**/ **/
EIGEN_DEVICE_FUNC
aligned_stack_memory_handler(T* ptr, std::size_t size, bool dealloc) aligned_stack_memory_handler(T* ptr, std::size_t size, bool dealloc)
: m_ptr(ptr), m_size(size), m_deallocate(dealloc) : m_ptr(ptr), m_size(size), m_deallocate(dealloc)
{ {
if(NumTraits<T>::RequireInitialization && m_ptr) if(NumTraits<T>::RequireInitialization && m_ptr)
Eigen::internal::construct_elements_of_array(m_ptr, size); Eigen::internal::construct_elements_of_array(m_ptr, size);
} }
EIGEN_DEVICE_FUNC
~aligned_stack_memory_handler() ~aligned_stack_memory_handler()
{ {
if(NumTraits<T>::RequireInitialization && m_ptr) if(NumTraits<T>::RequireInitialization && m_ptr)

View File

@ -544,6 +544,7 @@ using std::numeric_limits;
// Integer division with rounding up. // Integer division with rounding up.
// T is assumed to be an integer type with a>=0, and b>0 // T is assumed to be an integer type with a>=0, and b>0
template<typename T> template<typename T>
EIGEN_DEVICE_FUNC
T div_ceil(const T &a, const T &b) T div_ceil(const T &a, const T &b)
{ {
return (a+b-1) / b; return (a+b-1) / b;
@ -554,7 +555,7 @@ T div_ceil(const T &a, const T &b)
template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
bool equal_strict(const X& x,const Y& y) { return x == y; } bool equal_strict(const X& x,const Y& y) { return x == y; }
#if !defined(EIGEN_CUDA_ARCH) #if !defined(EIGEN_CUDA_ARCH) || defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC)
template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
bool equal_strict(const float& x,const float& y) { return std::equal_to<float>()(x,y); } bool equal_strict(const float& x,const float& y) { return std::equal_to<float>()(x,y); }
@ -565,7 +566,7 @@ bool equal_strict(const double& x,const double& y) { return std::equal_to<double
template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC template<typename X, typename Y> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
bool not_equal_strict(const X& x,const Y& y) { return x != y; } bool not_equal_strict(const X& x,const Y& y) { return x != y; }
#if !defined(EIGEN_CUDA_ARCH) #if !defined(EIGEN_CUDA_ARCH) || defined(EIGEN_CONSTEXPR_ARE_DEVICE_FUNC)
template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC template<> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC
bool not_equal_strict(const float& x,const float& y) { return std::not_equal_to<float>()(x,y); } bool not_equal_strict(const float& x,const float& y) { return std::not_equal_to<float>()(x,y); }

View File

@ -685,12 +685,14 @@ struct possibly_same_dense {
}; };
template<typename T1, typename T2> template<typename T1, typename T2>
EIGEN_DEVICE_FUNC
bool is_same_dense(const T1 &mat1, const T2 &mat2, typename enable_if<possibly_same_dense<T1,T2>::value>::type * = 0) bool is_same_dense(const T1 &mat1, const T2 &mat2, typename enable_if<possibly_same_dense<T1,T2>::value>::type * = 0)
{ {
return (mat1.data()==mat2.data()) && (mat1.innerStride()==mat2.innerStride()) && (mat1.outerStride()==mat2.outerStride()); return (mat1.data()==mat2.data()) && (mat1.innerStride()==mat2.innerStride()) && (mat1.outerStride()==mat2.outerStride());
} }
template<typename T1, typename T2> template<typename T1, typename T2>
EIGEN_DEVICE_FUNC
bool is_same_dense(const T1 &, const T2 &, typename enable_if<!possibly_same_dense<T1,T2>::value>::type * = 0) bool is_same_dense(const T1 &, const T2 &, typename enable_if<!possibly_same_dense<T1,T2>::value>::type * = 0)
{ {
return false; return false;

View File

@ -20,7 +20,9 @@ class GeneralizedSelfAdjointEigenSolver;
namespace internal { namespace internal {
template<typename SolverType,int Size,bool IsComplex> struct direct_selfadjoint_eigenvalues; template<typename SolverType,int Size,bool IsComplex> struct direct_selfadjoint_eigenvalues;
template<typename MatrixType, typename DiagType, typename SubDiagType> template<typename MatrixType, typename DiagType, typename SubDiagType>
EIGEN_DEVICE_FUNC
ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType& eivec); ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType& eivec);
} }
@ -354,7 +356,8 @@ template<typename _MatrixType> class SelfAdjointEigenSolver
static const int m_maxIterations = 30; static const int m_maxIterations = 30;
protected: protected:
static void check_template_parameters() static EIGEN_DEVICE_FUNC
void check_template_parameters()
{ {
EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar); EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar);
} }
@ -403,7 +406,7 @@ SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
const InputType &matrix(a_matrix.derived()); const InputType &matrix(a_matrix.derived());
using std::abs; EIGEN_USING_STD_MATH(abs);
eigen_assert(matrix.cols() == matrix.rows()); eigen_assert(matrix.cols() == matrix.rows());
eigen_assert((options&~(EigVecMask|GenEigMask))==0 eigen_assert((options&~(EigVecMask|GenEigMask))==0
&& (options&EigVecMask)!=EigVecMask && (options&EigVecMask)!=EigVecMask
@ -479,9 +482,10 @@ namespace internal {
* \returns \c Success or \c NoConvergence * \returns \c Success or \c NoConvergence
*/ */
template<typename MatrixType, typename DiagType, typename SubDiagType> template<typename MatrixType, typename DiagType, typename SubDiagType>
EIGEN_DEVICE_FUNC
ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType& eivec) ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag, const Index maxIterations, bool computeEigenvectors, MatrixType& eivec)
{ {
using std::abs; EIGEN_USING_STD_MATH(abs);
ComputationInfo info; ComputationInfo info;
typedef typename MatrixType::Scalar Scalar; typedef typename MatrixType::Scalar Scalar;
@ -535,7 +539,7 @@ ComputationInfo computeFromTridiagonal_impl(DiagType& diag, SubDiagType& subdiag
diag.segment(i,n-i).minCoeff(&k); diag.segment(i,n-i).minCoeff(&k);
if (k > 0) if (k > 0)
{ {
std::swap(diag[i], diag[k+i]); numext::swap(diag[i], diag[k+i]);
if(computeEigenvectors) if(computeEigenvectors)
eivec.col(i).swap(eivec.col(k+i)); eivec.col(i).swap(eivec.col(k+i));
} }
@ -605,7 +609,7 @@ template<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,3
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
static inline bool extract_kernel(MatrixType& mat, Ref<VectorType> res, Ref<VectorType> representative) static inline bool extract_kernel(MatrixType& mat, Ref<VectorType> res, Ref<VectorType> representative)
{ {
using std::abs; EIGEN_USING_STD_MATH(abs);
Index i0; Index i0;
// Find non-zero column i0 (by construction, there must exist a non zero coefficient on the diagonal): // Find non-zero column i0 (by construction, there must exist a non zero coefficient on the diagonal):
mat.diagonal().cwiseAbs().maxCoeff(&i0); mat.diagonal().cwiseAbs().maxCoeff(&i0);
@ -807,7 +811,7 @@ template<int StorageOrder,typename RealScalar, typename Scalar, typename Index>
EIGEN_DEVICE_FUNC EIGEN_DEVICE_FUNC
static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n) static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n)
{ {
using std::abs; EIGEN_USING_STD_MATH(abs);
RealScalar td = (diag[end-1] - diag[end])*RealScalar(0.5); RealScalar td = (diag[end-1] - diag[end])*RealScalar(0.5);
RealScalar e = subdiag[end-1]; RealScalar e = subdiag[end-1];
// Note that thanks to scaling, e^2 or td^2 cannot overflow, however they can still // Note that thanks to scaling, e^2 or td^2 cannot overflow, however they can still

View File

@ -25,6 +25,7 @@ struct traits<TridiagonalizationMatrixTReturnType<MatrixType> >
}; };
template<typename MatrixType, typename CoeffVectorType> template<typename MatrixType, typename CoeffVectorType>
EIGEN_DEVICE_FUNC
void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs); void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs);
} }
@ -344,6 +345,7 @@ namespace internal {
* \sa Tridiagonalization::packedMatrix() * \sa Tridiagonalization::packedMatrix()
*/ */
template<typename MatrixType, typename CoeffVectorType> template<typename MatrixType, typename CoeffVectorType>
EIGEN_DEVICE_FUNC
void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs) void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs)
{ {
using numext::conj; using numext::conj;
@ -424,6 +426,7 @@ struct tridiagonalization_inplace_selector;
* \sa class Tridiagonalization * \sa class Tridiagonalization
*/ */
template<typename MatrixType, typename DiagonalType, typename SubDiagonalType> template<typename MatrixType, typename DiagonalType, typename SubDiagonalType>
EIGEN_DEVICE_FUNC
void tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ) void tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)
{ {
eigen_assert(mat.cols()==mat.rows() && diag.size()==mat.rows() && subdiag.size()==mat.rows()-1); eigen_assert(mat.cols()==mat.rows() && diag.size()==mat.rows() && subdiag.size()==mat.rows()-1);
@ -439,7 +442,8 @@ struct tridiagonalization_inplace_selector
typedef typename Tridiagonalization<MatrixType>::CoeffVectorType CoeffVectorType; typedef typename Tridiagonalization<MatrixType>::CoeffVectorType CoeffVectorType;
typedef typename Tridiagonalization<MatrixType>::HouseholderSequenceType HouseholderSequenceType; typedef typename Tridiagonalization<MatrixType>::HouseholderSequenceType HouseholderSequenceType;
template<typename DiagonalType, typename SubDiagonalType> template<typename DiagonalType, typename SubDiagonalType>
static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ) static EIGEN_DEVICE_FUNC
void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)
{ {
CoeffVectorType hCoeffs(mat.cols()-1); CoeffVectorType hCoeffs(mat.cols()-1);
tridiagonalization_inplace(mat,hCoeffs); tridiagonalization_inplace(mat,hCoeffs);
@ -508,7 +512,8 @@ struct tridiagonalization_inplace_selector<MatrixType,1,IsComplex>
typedef typename MatrixType::Scalar Scalar; typedef typename MatrixType::Scalar Scalar;
template<typename DiagonalType, typename SubDiagonalType> template<typename DiagonalType, typename SubDiagonalType>
static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType&, bool extractQ) static EIGEN_DEVICE_FUNC
void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType&, bool extractQ)
{ {
diag(0,0) = numext::real(mat(0,0)); diag(0,0) = numext::real(mat(0,0));
if(extractQ) if(extractQ)

View File

@ -39,6 +39,7 @@ template<int n> struct decrement_size
* MatrixBase::applyHouseholderOnTheRight() * MatrixBase::applyHouseholderOnTheRight()
*/ */
template<typename Derived> template<typename Derived>
EIGEN_DEVICE_FUNC
void MatrixBase<Derived>::makeHouseholderInPlace(Scalar& tau, RealScalar& beta) void MatrixBase<Derived>::makeHouseholderInPlace(Scalar& tau, RealScalar& beta)
{ {
VectorBlock<Derived, internal::decrement_size<Base::SizeAtCompileTime>::ret> essentialPart(derived(), 1, size()-1); VectorBlock<Derived, internal::decrement_size<Base::SizeAtCompileTime>::ret> essentialPart(derived(), 1, size()-1);
@ -62,6 +63,7 @@ void MatrixBase<Derived>::makeHouseholderInPlace(Scalar& tau, RealScalar& beta)
*/ */
template<typename Derived> template<typename Derived>
template<typename EssentialPart> template<typename EssentialPart>
EIGEN_DEVICE_FUNC
void MatrixBase<Derived>::makeHouseholder( void MatrixBase<Derived>::makeHouseholder(
EssentialPart& essential, EssentialPart& essential,
Scalar& tau, Scalar& tau,
@ -110,6 +112,7 @@ void MatrixBase<Derived>::makeHouseholder(
*/ */
template<typename Derived> template<typename Derived>
template<typename EssentialPart> template<typename EssentialPart>
EIGEN_DEVICE_FUNC
void MatrixBase<Derived>::applyHouseholderOnTheLeft( void MatrixBase<Derived>::applyHouseholderOnTheLeft(
const EssentialPart& essential, const EssentialPart& essential,
const Scalar& tau, const Scalar& tau,
@ -147,6 +150,7 @@ void MatrixBase<Derived>::applyHouseholderOnTheLeft(
*/ */
template<typename Derived> template<typename Derived>
template<typename EssentialPart> template<typename EssentialPart>
EIGEN_DEVICE_FUNC
void MatrixBase<Derived>::applyHouseholderOnTheRight( void MatrixBase<Derived>::applyHouseholderOnTheRight(
const EssentialPart& essential, const EssentialPart& essential,
const Scalar& tau, const Scalar& tau,

View File

@ -87,7 +87,7 @@ struct hseq_side_dependent_impl
{ {
typedef Block<const VectorsType, Dynamic, 1> EssentialVectorType; typedef Block<const VectorsType, Dynamic, 1> EssentialVectorType;
typedef HouseholderSequence<VectorsType, CoeffsType, OnTheLeft> HouseholderSequenceType; typedef HouseholderSequence<VectorsType, CoeffsType, OnTheLeft> HouseholderSequenceType;
static inline const EssentialVectorType essentialVector(const HouseholderSequenceType& h, Index k) static EIGEN_DEVICE_FUNC inline const EssentialVectorType essentialVector(const HouseholderSequenceType& h, Index k)
{ {
Index start = k+1+h.m_shift; Index start = k+1+h.m_shift;
return Block<const VectorsType,Dynamic,1>(h.m_vectors, start, k, h.rows()-start, 1); return Block<const VectorsType,Dynamic,1>(h.m_vectors, start, k, h.rows()-start, 1);
@ -173,6 +173,7 @@ template<typename VectorsType, typename CoeffsType, int Side> class HouseholderS
* *
* \sa setLength(), setShift() * \sa setLength(), setShift()
*/ */
EIGEN_DEVICE_FUNC
HouseholderSequence(const VectorsType& v, const CoeffsType& h) HouseholderSequence(const VectorsType& v, const CoeffsType& h)
: m_vectors(v), m_coeffs(h), m_reverse(false), m_length(v.diagonalSize()), : m_vectors(v), m_coeffs(h), m_reverse(false), m_length(v.diagonalSize()),
m_shift(0) m_shift(0)
@ -180,6 +181,7 @@ template<typename VectorsType, typename CoeffsType, int Side> class HouseholderS
} }
/** \brief Copy constructor. */ /** \brief Copy constructor. */
EIGEN_DEVICE_FUNC
HouseholderSequence(const HouseholderSequence& other) HouseholderSequence(const HouseholderSequence& other)
: m_vectors(other.m_vectors), : m_vectors(other.m_vectors),
m_coeffs(other.m_coeffs), m_coeffs(other.m_coeffs),
@ -193,12 +195,14 @@ template<typename VectorsType, typename CoeffsType, int Side> class HouseholderS
* \returns Number of rows * \returns Number of rows
* \details This equals the dimension of the space that the transformation acts on. * \details This equals the dimension of the space that the transformation acts on.
*/ */
EIGEN_DEVICE_FUNC
Index rows() const { return Side==OnTheLeft ? m_vectors.rows() : m_vectors.cols(); } Index rows() const { return Side==OnTheLeft ? m_vectors.rows() : m_vectors.cols(); }
/** \brief Number of columns of transformation viewed as a matrix. /** \brief Number of columns of transformation viewed as a matrix.
* \returns Number of columns * \returns Number of columns
* \details This equals the dimension of the space that the transformation acts on. * \details This equals the dimension of the space that the transformation acts on.
*/ */
EIGEN_DEVICE_FUNC
Index cols() const { return rows(); } Index cols() const { return rows(); }
/** \brief Essential part of a Householder vector. /** \brief Essential part of a Householder vector.
@ -215,6 +219,7 @@ template<typename VectorsType, typename CoeffsType, int Side> class HouseholderS
* *
* \sa setShift(), shift() * \sa setShift(), shift()
*/ */
EIGEN_DEVICE_FUNC
const EssentialVectorType essentialVector(Index k) const const EssentialVectorType essentialVector(Index k) const
{ {
eigen_assert(k >= 0 && k < m_length); eigen_assert(k >= 0 && k < m_length);
@ -252,7 +257,9 @@ template<typename VectorsType, typename CoeffsType, int Side> class HouseholderS
AdjointReturnType inverse() const { return adjoint(); } AdjointReturnType inverse() const { return adjoint(); }
/** \internal */ /** \internal */
template<typename DestType> inline void evalTo(DestType& dst) const template<typename DestType>
inline EIGEN_DEVICE_FUNC
void evalTo(DestType& dst) const
{ {
Matrix<Scalar, DestType::RowsAtCompileTime, 1, Matrix<Scalar, DestType::RowsAtCompileTime, 1,
AutoAlign|ColMajor, DestType::MaxRowsAtCompileTime, 1> workspace(rows()); AutoAlign|ColMajor, DestType::MaxRowsAtCompileTime, 1> workspace(rows());
@ -261,6 +268,7 @@ template<typename VectorsType, typename CoeffsType, int Side> class HouseholderS
/** \internal */ /** \internal */
template<typename Dest, typename Workspace> template<typename Dest, typename Workspace>
EIGEN_DEVICE_FUNC
void evalTo(Dest& dst, Workspace& workspace) const void evalTo(Dest& dst, Workspace& workspace) const
{ {
workspace.resize(rows()); workspace.resize(rows());
@ -394,6 +402,7 @@ template<typename VectorsType, typename CoeffsType, int Side> class HouseholderS
* *
* \sa length() * \sa length()
*/ */
EIGEN_DEVICE_FUNC
HouseholderSequence& setLength(Index length) HouseholderSequence& setLength(Index length)
{ {
m_length = length; m_length = length;
@ -411,13 +420,17 @@ template<typename VectorsType, typename CoeffsType, int Side> class HouseholderS
* *
* \sa shift() * \sa shift()
*/ */
EIGEN_DEVICE_FUNC
HouseholderSequence& setShift(Index shift) HouseholderSequence& setShift(Index shift)
{ {
m_shift = shift; m_shift = shift;
return *this; return *this;
} }
EIGEN_DEVICE_FUNC
Index length() const { return m_length; } /**< \brief Returns the length of the Householder sequence. */ Index length() const { return m_length; } /**< \brief Returns the length of the Householder sequence. */
EIGEN_DEVICE_FUNC
Index shift() const { return m_shift; } /**< \brief Returns the shift of the Householder sequence. */ Index shift() const { return m_shift; } /**< \brief Returns the shift of the Householder sequence. */
/* Necessary for .adjoint() and .conjugate() */ /* Necessary for .adjoint() and .conjugate() */

View File

@ -90,6 +90,7 @@ template<typename Scalar> class JacobiRotation
* \sa MatrixBase::makeJacobi(const MatrixBase<Derived>&, Index, Index), MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight() * \sa MatrixBase::makeJacobi(const MatrixBase<Derived>&, Index, Index), MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
*/ */
template<typename Scalar> template<typename Scalar>
EIGEN_DEVICE_FUNC
bool JacobiRotation<Scalar>::makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z) bool JacobiRotation<Scalar>::makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z)
{ {
using std::sqrt; using std::sqrt;
@ -134,6 +135,7 @@ bool JacobiRotation<Scalar>::makeJacobi(const RealScalar& x, const Scalar& y, co
*/ */
template<typename Scalar> template<typename Scalar>
template<typename Derived> template<typename Derived>
EIGEN_DEVICE_FUNC
inline bool JacobiRotation<Scalar>::makeJacobi(const MatrixBase<Derived>& m, Index p, Index q) inline bool JacobiRotation<Scalar>::makeJacobi(const MatrixBase<Derived>& m, Index p, Index q)
{ {
return makeJacobi(numext::real(m.coeff(p,p)), m.coeff(p,q), numext::real(m.coeff(q,q))); return makeJacobi(numext::real(m.coeff(p,p)), m.coeff(p,q), numext::real(m.coeff(q,q)));
@ -156,6 +158,7 @@ inline bool JacobiRotation<Scalar>::makeJacobi(const MatrixBase<Derived>& m, Ind
* \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight() * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
*/ */
template<typename Scalar> template<typename Scalar>
EIGEN_DEVICE_FUNC
void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* z) void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* z)
{ {
makeGivens(p, q, z, typename internal::conditional<NumTraits<Scalar>::IsComplex, internal::true_type, internal::false_type>::type()); makeGivens(p, q, z, typename internal::conditional<NumTraits<Scalar>::IsComplex, internal::true_type, internal::false_type>::type());
@ -164,6 +167,7 @@ void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar
// specialization for complexes // specialization for complexes
template<typename Scalar> template<typename Scalar>
EIGEN_DEVICE_FUNC
void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::true_type) void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::true_type)
{ {
using std::sqrt; using std::sqrt;
@ -223,6 +227,7 @@ void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar
// specialization for reals // specialization for reals
template<typename Scalar> template<typename Scalar>
EIGEN_DEVICE_FUNC
void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::false_type) void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::false_type)
{ {
using std::sqrt; using std::sqrt;
@ -286,6 +291,7 @@ void apply_rotation_in_the_plane(DenseBase<VectorX>& xpr_x, DenseBase<VectorY>&
*/ */
template<typename Derived> template<typename Derived>
template<typename OtherScalar> template<typename OtherScalar>
EIGEN_DEVICE_FUNC
inline void MatrixBase<Derived>::applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j) inline void MatrixBase<Derived>::applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j)
{ {
RowXpr x(this->row(p)); RowXpr x(this->row(p));
@ -301,6 +307,7 @@ inline void MatrixBase<Derived>::applyOnTheLeft(Index p, Index q, const JacobiRo
*/ */
template<typename Derived> template<typename Derived>
template<typename OtherScalar> template<typename OtherScalar>
EIGEN_DEVICE_FUNC
inline void MatrixBase<Derived>::applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j) inline void MatrixBase<Derived>::applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j)
{ {
ColXpr x(this->col(p)); ColXpr x(this->col(p));
@ -314,7 +321,8 @@ template<typename Scalar, typename OtherScalar,
int SizeAtCompileTime, int MinAlignment, bool Vectorizable> int SizeAtCompileTime, int MinAlignment, bool Vectorizable>
struct apply_rotation_in_the_plane_selector struct apply_rotation_in_the_plane_selector
{ {
static inline void run(Scalar *x, Index incrx, Scalar *y, Index incry, Index size, OtherScalar c, OtherScalar s) static EIGEN_DEVICE_FUNC
inline void run(Scalar *x, Index incrx, Scalar *y, Index incry, Index size, OtherScalar c, OtherScalar s)
{ {
for(Index i=0; i<size; ++i) for(Index i=0; i<size; ++i)
{ {
@ -441,6 +449,7 @@ struct apply_rotation_in_the_plane_selector<Scalar,OtherScalar,SizeAtCompileTime
}; };
template<typename VectorX, typename VectorY, typename OtherScalar> template<typename VectorX, typename VectorY, typename OtherScalar>
EIGEN_DEVICE_FUNC
void /*EIGEN_DONT_INLINE*/ apply_rotation_in_the_plane(DenseBase<VectorX>& xpr_x, DenseBase<VectorY>& xpr_y, const JacobiRotation<OtherScalar>& j) void /*EIGEN_DONT_INLINE*/ apply_rotation_in_the_plane(DenseBase<VectorX>& xpr_x, DenseBase<VectorY>& xpr_y, const JacobiRotation<OtherScalar>& j)
{ {
typedef typename VectorX::Scalar Scalar; typedef typename VectorX::Scalar Scalar;

View File

@ -15,6 +15,7 @@ namespace Eigen {
namespace internal { namespace internal {
template<typename Derived> template<typename Derived>
EIGEN_DEVICE_FUNC
inline const typename Derived::Scalar bruteforce_det3_helper inline const typename Derived::Scalar bruteforce_det3_helper
(const MatrixBase<Derived>& matrix, int a, int b, int c) (const MatrixBase<Derived>& matrix, int a, int b, int c)
{ {
@ -23,6 +24,7 @@ inline const typename Derived::Scalar bruteforce_det3_helper
} }
template<typename Derived> template<typename Derived>
EIGEN_DEVICE_FUNC
const typename Derived::Scalar bruteforce_det4_helper const typename Derived::Scalar bruteforce_det4_helper
(const MatrixBase<Derived>& matrix, int j, int k, int m, int n) (const MatrixBase<Derived>& matrix, int j, int k, int m, int n)
{ {
@ -44,7 +46,8 @@ template<typename Derived,
template<typename Derived> struct determinant_impl<Derived, 1> template<typename Derived> struct determinant_impl<Derived, 1>
{ {
static inline typename traits<Derived>::Scalar run(const Derived& m) static inline EIGEN_DEVICE_FUNC
typename traits<Derived>::Scalar run(const Derived& m)
{ {
return m.coeff(0,0); return m.coeff(0,0);
} }
@ -52,7 +55,8 @@ template<typename Derived> struct determinant_impl<Derived, 1>
template<typename Derived> struct determinant_impl<Derived, 2> template<typename Derived> struct determinant_impl<Derived, 2>
{ {
static inline typename traits<Derived>::Scalar run(const Derived& m) static inline EIGEN_DEVICE_FUNC
typename traits<Derived>::Scalar run(const Derived& m)
{ {
return m.coeff(0,0) * m.coeff(1,1) - m.coeff(1,0) * m.coeff(0,1); return m.coeff(0,0) * m.coeff(1,1) - m.coeff(1,0) * m.coeff(0,1);
} }
@ -60,7 +64,8 @@ template<typename Derived> struct determinant_impl<Derived, 2>
template<typename Derived> struct determinant_impl<Derived, 3> template<typename Derived> struct determinant_impl<Derived, 3>
{ {
static inline typename traits<Derived>::Scalar run(const Derived& m) static inline EIGEN_DEVICE_FUNC
typename traits<Derived>::Scalar run(const Derived& m)
{ {
return bruteforce_det3_helper(m,0,1,2) return bruteforce_det3_helper(m,0,1,2)
- bruteforce_det3_helper(m,1,0,2) - bruteforce_det3_helper(m,1,0,2)
@ -70,7 +75,8 @@ template<typename Derived> struct determinant_impl<Derived, 3>
template<typename Derived> struct determinant_impl<Derived, 4> template<typename Derived> struct determinant_impl<Derived, 4>
{ {
static typename traits<Derived>::Scalar run(const Derived& m) static EIGEN_DEVICE_FUNC
typename traits<Derived>::Scalar run(const Derived& m)
{ {
// trick by Martin Costabel to compute 4x4 det with only 30 muls // trick by Martin Costabel to compute 4x4 det with only 30 muls
return bruteforce_det4_helper(m,0,1,2,3) return bruteforce_det4_helper(m,0,1,2,3)
@ -89,6 +95,7 @@ template<typename Derived> struct determinant_impl<Derived, 4>
* \returns the determinant of this matrix * \returns the determinant of this matrix
*/ */
template<typename Derived> template<typename Derived>
EIGEN_DEVICE_FUNC
inline typename internal::traits<Derived>::Scalar MatrixBase<Derived>::determinant() const inline typename internal::traits<Derived>::Scalar MatrixBase<Derived>::determinant() const
{ {
eigen_assert(rows() == cols()); eigen_assert(rows() == cols());

View File

@ -290,6 +290,7 @@ template<typename DstXprType, typename XprType>
struct Assignment<DstXprType, Inverse<XprType>, internal::assign_op<typename DstXprType::Scalar,typename XprType::Scalar>, Dense2Dense> struct Assignment<DstXprType, Inverse<XprType>, internal::assign_op<typename DstXprType::Scalar,typename XprType::Scalar>, Dense2Dense>
{ {
typedef Inverse<XprType> SrcXprType; typedef Inverse<XprType> SrcXprType;
EIGEN_DEVICE_FUNC
static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename XprType::Scalar> &) static void run(DstXprType &dst, const SrcXprType &src, const internal::assign_op<typename DstXprType::Scalar,typename XprType::Scalar> &)
{ {
Index dstRows = src.rows(); Index dstRows = src.rows();
@ -332,6 +333,7 @@ struct Assignment<DstXprType, Inverse<XprType>, internal::assign_op<typename Dst
* \sa computeInverseAndDetWithCheck() * \sa computeInverseAndDetWithCheck()
*/ */
template<typename Derived> template<typename Derived>
EIGEN_DEVICE_FUNC
inline const Inverse<Derived> MatrixBase<Derived>::inverse() const inline const Inverse<Derived> MatrixBase<Derived>::inverse() const
{ {
EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsInteger,THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES) EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsInteger,THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES)

View File

@ -1061,6 +1061,7 @@ EIGEN_DOC_BLOCK_ADDONS_NOT_INNER_PANEL
/// \sa block(Index,Index,NRowsType,NColsType), class Block /// \sa block(Index,Index,NRowsType,NColsType), class Block
/// ///
template<int NRows, int NCols> template<int NRows, int NCols>
EIGEN_DEVICE_FUNC
inline typename FixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol, inline typename FixedBlockXpr<NRows,NCols>::Type block(Index startRow, Index startCol,
Index blockRows, Index blockCols) Index blockRows, Index blockCols)
{ {