如果 Eigen 矩阵中的行数不是对齐步长的倍数(通常为 16 字节),那么似乎只有矩阵的第一列会对齐。例如:
Eigen::MatrixXf m(7, 7);
std::cout << "1st column start address: " << &m(0, 0) << "\n";
std::cout << "2nd column start address: " << &m(0, 1) << "\n";
1st column start address: 0x100704c80
2nd column start address: 0x100704c9c
第一列对齐,第二列不对齐。
我正在编写访问此矩阵的外部 SIMD 代码。如果我们可以保证每一列都从对齐的地址开始,那么它可能是最快的。让 Eigen 分配我的矩阵以使每一列对齐的惯用方法是什么?
这就是我现在要做的。这并不理想,因为矩阵的用户必须始终使用
topRows()
或 .rows()
的等效技术来返回所需的活动行数。
// rounds up the number of rows/cols to ensure each col/row starts aligned
template <class M>
inline void resizeAligned(M &m, Eigen::Index rows, Eigen::Index cols)
{
static constexpr auto mask = EIGEN_DEFAULT_ALIGN_BYTES - 1;
auto &size = m.IsRowMajor ? cols : rows;
size = (size + mask) & ~mask;
m.resize(rows, cols);
}