mirror of
https://gitlab.com/libeigen/eigen.git
synced 2024-12-21 07:19:46 +08:00
e6f1104b57
* extend PartialRedux::cross() to any matrix sizes with automatic vectorization when possible * unit tests: add "geo_" prefix to all unit tests related to the geometry module and start splitting the big "geometry.cpp" tests to multiple smaller ones (also include new tests)
39 lines
1.6 KiB
Plaintext
39 lines
1.6 KiB
Plaintext
namespace Eigen {
|
|
|
|
/** \page FixedSizeVectorizable Advanced - Fixed-size vectorizable Eigen objects
|
|
|
|
The goal of this page is to explain what we mean by "fixed-size vectorizable".
|
|
|
|
\section summary Executive Summary
|
|
|
|
An Eigen object is called "fixed-size vectorizable" if it has fixed size and that size is a multiple of 16 bytes.
|
|
|
|
Examples include:
|
|
\li Eigen::Vector2d
|
|
\li Eigen::Vector4d
|
|
\li Eigen::Vector4f
|
|
\li Eigen::Matrix2d
|
|
\li Eigen::Matrix2f
|
|
\li Eigen::Matrix4d
|
|
\li Eigen::Matrix4f
|
|
\li Eigen::Transform3d
|
|
\li Eigen::Transform3f
|
|
\li Eigen::Quaterniond
|
|
\li Eigen::Quaternionf
|
|
|
|
\section explanation Explanation
|
|
|
|
First, "fixed-size" should be clear: an Eigen object has fixed size if its number of rows and its number of columns are fixed at compile-time. So for example Matrix3f has fixed size, but MatrixXf doesn't (the opposite of fixed-size is dynamic-size).
|
|
|
|
The array of coefficients of a fixed-size Eigen object is a plain "static array", it is not dynamically allocated. For example, the data behind a Matrix4f is just a "float array[16]".
|
|
|
|
Fixed-size objects are typically very small, which means that we want to handle them with zero runtime overhead -- both in terms of memory usage and of speed.
|
|
|
|
Now, vectorization (both SSE and AltiVec) works with 128-bit packets. Moreover, for performance reasons, these packets need to be have 128-bit alignment.
|
|
|
|
So it turns out that the only way that fixed-size Eigen objects can be vectorized, is if their size is a multiple of 128 bits, or 16 bytes. Eigen will then request 16-byte alignment for these objects, and henceforth rely on these objects being aligned so no runtime check for alignment is performed.
|
|
|
|
*/
|
|
|
|
}
|