Brian Silverman | 72890c2 | 2015-09-19 14:37:37 -0400 | [diff] [blame^] | 1 | namespace Eigen { |
| 2 | |
| 3 | /** \eigenManualPage TopicFixedSizeVectorizable Fixed-size vectorizable Eigen objects |
| 4 | |
| 5 | The goal of this page is to explain what we mean by "fixed-size vectorizable". |
| 6 | |
| 7 | \section summary Executive Summary |
| 8 | |
| 9 | An Eigen object is called "fixed-size vectorizable" if it has fixed size and that size is a multiple of 16 bytes. |
| 10 | |
| 11 | Examples include: |
| 12 | \li Eigen::Vector2d |
| 13 | \li Eigen::Vector4d |
| 14 | \li Eigen::Vector4f |
| 15 | \li Eigen::Matrix2d |
| 16 | \li Eigen::Matrix2f |
| 17 | \li Eigen::Matrix4d |
| 18 | \li Eigen::Matrix4f |
| 19 | \li Eigen::Affine3d |
| 20 | \li Eigen::Affine3f |
| 21 | \li Eigen::Quaterniond |
| 22 | \li Eigen::Quaternionf |
| 23 | |
| 24 | \section explanation Explanation |
| 25 | |
| 26 | 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). |
| 27 | |
| 28 | 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]". |
| 29 | |
| 30 | 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. |
| 31 | |
| 32 | Now, vectorization (both SSE and AltiVec) works with 128-bit packets. Moreover, for performance reasons, these packets need to be have 128-bit alignment. |
| 33 | |
| 34 | 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. |
| 35 | |
| 36 | */ |
| 37 | |
| 38 | } |