如何对齐特征矩阵的每一列?

问题描述 投票:0回答:1

如果 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 分配我的矩阵以使每一列对齐的惯用方法是什么?

eigen simd memory-alignment
1个回答
0
投票

这就是我现在要做的。这并不理想,因为矩阵的用户必须始终使用

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.