Difference between revisions of "User:Tellenbach/3.4"

From Eigen
Jump to: navigation, search
Line 1: Line 1:
 +
== Changes to Supported Modules ==
 +
 
=== Changes that might impact existing code ===
 
=== Changes that might impact existing code ===
  
Line 42: Line 44:
  
 
* '''Arm SVE:''' Eigen now supports Arm's [https://developer.arm.com/documentation/101726/0300/Learn-about-the-Scalable-Vector-Extension--SVE-/What-is-the-Scalable-Vector-Extension-  Scalable Vector Extension (SVE)]. Currently only fixed-lenght SVE vectors for <code>uint32_t</code> and <code>float</code> are available.
 
* '''Arm SVE:''' Eigen now supports Arm's [https://developer.arm.com/documentation/101726/0300/Learn-about-the-Scalable-Vector-Extension--SVE-/What-is-the-Scalable-Vector-Extension-  Scalable Vector Extension (SVE)]. Currently only fixed-lenght SVE vectors for <code>uint32_t</code> and <code>float</code> are available.
 +
* '''MIPS MSA:''' Eigen now supports the [https://www.mips.com/products/architectures/ase/simd/ MIPS SIMD Architecture (MSA)]
  
 
=== Improvements to Eigen Core ===
 
=== Improvements to Eigen Core ===
Line 50: Line 53:
 
** Eigen's GEMM now falls back to GEMV if it detects that a matrix is a run-time vector
 
** Eigen's GEMM now falls back to GEMV if it detects that a matrix is a run-time vector
 
** The performance of matrix products using Arm Neon has been drastically improved (up to 20%)
 
** The performance of matrix products using Arm Neon has been drastically improved (up to 20%)
 +
** Performance of many special cases of matrix products has been improved
 +
 +
=== Backend-specific improvements ===
 +
 +
* The '''Arm NEON''' backend has been largely improved:
 +
** It now provides vectorzation for <code>uint64_t</code>, <code>int64_t</code>, <code>uint32_t</code>, <code>int16_t</code>, <code>uint16_t</code>, <code>int16_t</code>, <code>int8_t</code>, and <code>uint8_t</code>
 +
** It now can emulate `bfloat16` support when using <code>Eigen::bfloat16</code>
 +
** It now supports emulated and native `float16` when using <code>Eigen::float16</code>
 +
 +
== Changes to Unupported Modules ==
 +
 +
=== Improvements to EulerAngles ===
 +
 +
* EulerAngles can now be directly constructed from 3D vectors
 +
* EulerAngles now provide <code>isApprox()</code> and <code>cast()</code> functions
 +
 +
=== Improvements to Polynomials ===
 +
 +
* PolynomialSolver can now be used with complex numbers
 +
* The used solver will automatically choose between <code>EigenSolver</code> and <code>ComplexEigenSolver</code> depending on the scalar type used
 +
 +
== Other relevant changes ==
 +
 +
* Eigen now provides an option to test with an external BLAS library
 +
* Eigen can now be used with the [https://en.wikipedia.org/wiki/The_Portland_Group PGI Compiler]
 +
* Printing when using GDB has been improved
 +
* Eigen can now detect if a platform supports <code>int128</code> intrinsics

Revision as of 21:50, 17 August 2021

Changes to Supported Modules

Changes that might impact existing code

  • Using float or double for indexing matrices, vectors and array will now fail to compile, ex.:
MatrixXd A(10,10);
float one = 1;
double a11 = A(one,1.); // compilation error here

New Major Features in Core

  • Add c++11 initializer_list constructors to Matrix and Array [doc]:
MatrixXi a {      // construct a 2x3 matrix
      {1,2,3},    // first row
      {4,5,6}     // second row
};
VectorXd v{{1, 2, 3, 4, 5}}; // construct a dynamic-size vector with 5 elements
Array<int,1,5> a{1,2, 3, 4, 5}; // initialize a fixed-size 1D array of size 5.
  • Add STL-compatible iterators for dense expressions [doc]. Some examples:
VectorXd v = ...;
MatrixXd A = ...;
// range for loop over all entries of v then A
for(auto x : v) { cout << x << " "; }
for(auto x : A.reshaped()) { cout << x << " "; }
// sort v then each column of A
std::sort(v.begin(), v.end());
for(auto c : A.colwise())
    std::sort(c.begin(), c.end());
  • Add C++11 template aliases for Matrix, Vector, and Array of common sizes, including generic Vector<Type,Size> and RowVector<Type,Size> aliases [doc].
MatrixX<double> M;  // Instead of MatrixXd or Matrix<Dynamic, Dynamic, double>
Vector4<MyType> V;   // Instead of Vector<4, MyType>

New Backends

Improvements to Eigen Core

  • Eigen now uses c++11 alignas keyword for static alignment. Users targeting C++17 only and recent compilers (e.g., GCC>=7, clang>=5, MSVC>=19.12) will thus be able to completely forget about all issues related to static alignment, including EIGEN_MAKE_ALIGNED_OPERATOR_NEW.
  • Various performance improvements for products and Eigen's GEBP and GEMV kernels have been implemented:
    • By using half- and quater-packets the performance of matrix multiplications of small to medium sized matrices has been improved
    • Eigen's GEMM now falls back to GEMV if it detects that a matrix is a run-time vector
    • The performance of matrix products using Arm Neon has been drastically improved (up to 20%)
    • Performance of many special cases of matrix products has been improved

Backend-specific improvements

  • The Arm NEON backend has been largely improved:
    • It now provides vectorzation for uint64_t, int64_t, uint32_t, int16_t, uint16_t, int16_t, int8_t, and uint8_t
    • It now can emulate `bfloat16` support when using Eigen::bfloat16
    • It now supports emulated and native `float16` when using Eigen::float16

Changes to Unupported Modules

Improvements to EulerAngles

  • EulerAngles can now be directly constructed from 3D vectors
  • EulerAngles now provide isApprox() and cast() functions

Improvements to Polynomials

  • PolynomialSolver can now be used with complex numbers
  • The used solver will automatically choose between EigenSolver and ComplexEigenSolver depending on the scalar type used

Other relevant changes

  • Eigen now provides an option to test with an external BLAS library
  • Eigen can now be used with the PGI Compiler
  • Printing when using GDB has been improved
  • Eigen can now detect if a platform supports int128 intrinsics