Объекты Eigen с фиксированным размером, пригодные для векторизации
Цель этой страницы — объяснить, что мы понимаем под «объектами с фиксированным размером, пригодными для векторизации».
Резюме
Объект Eigen называется «объектом с фиксированным размером, пригодным для векторизации», если его размер фиксирован и кратен 16 байтам.
Примеры включают:
- Eigen::Vector2d
- Eigen::Vector4d
- Eigen::Vector4f
- Eigen::Matrix2d
- Eigen::Matrix2f
- Eigen::Matrix4d
- Eigen::Matrix4f
- Eigen::Affine3d
- Eigen::Affine3f
- Eigen::Quaterniond
- Eigen::Quaternionf
Объяснение
Прежде всего, «фиксированный размер» должен быть понятен: объект Eigen имеет фиксированный размер, если количество строк и столбцов фиксировано во время компиляции. Например, Matrix3f имеет фиксированный размер, а MatrixXf — нет (противоположность фиксированному размеру — динамический размер).
Массив коэффициентов объекта Eigen с фиксированным размером — это обычный «статический массив», он не выделяется динамически. Например, данные за Matrix4f — это просто «float array[16]».
Объекты с фиксированным размером обычно очень маленькие, поэтому мы хотим обрабатывать их без накладных расходов во время выполнения — как в плане использования памяти, так и скорости.
Теперь, векторизация работает с 128-битными пакетами (например, SSE, AltiVec, NEON), 256-битными пакетами (например, AVX) или 512-битными пакетами (например, AVX512). Кроме того, по соображениям производительности эти пакеты наиболее эффективно читаются и записываются, если они имеют такое же выравнивание, как и размер пакета, то есть 16 байт, 32 байта и 64 байта соответственно.
Таким образом, оказывается, что наилучшим способом векторизации объектов Eigen с фиксированным размером является использование размера, кратного 16 байтам (или больше). Eigen затем запросит выравнивание в 16 байт (или больше) для этих объектов и, следовательно, будет полагаться на их выравнивание для достижения максимальной эффективности.
© Eigen.
Licensed under the MPL2 License.
https://eigen.tuxfamily.org/dox/group__TopicFixedSizeVectorizable.html