我有一个应用程序需要将N Eigen
矩阵传递给某些函数。 N是一个编译时常量,这些函数在紧密循环中被称为很多次。为了避免动态分配是运行时,我认为将这些矩阵存储在std::array
中,然后将迭代器作为函数参数传递给此数组可能会很好。作为一个简单的例子,请考虑:
const int N = 3;
const int SIZE = 125;
typedef std::array<Eigen::Matrix<double, SIZE, 1>, N> MatrixArray;
void computeMatrixProductArray(MatrixArray::const_iterator BeginIn,
MatrixArray::const_iterator BeginEnd,
MatrixArray::iterator BeginOut,
MatrixArray::iterator EndOut)
{
Eigen::Matrix<double, SIZE, 1> Test;
for (int J = 0; J < N; ++J) {
*(BeginOut + J) = Test.array() * (*(BeginIn + J)).array();
}
}
int main()
{
MatrixArray ArrayIn, ArrayOut;
computeMatrixProductArray(ArrayIn.cbegin(), ArrayIn.cend(),
ArrayOut.begin(), ArrayOut.end());
}
我的问题与MatrixArray
中存储的矩阵的对齐有关,以及Eigen3.3如何处理未对齐的内存。矩阵的大小和std::array
的属性确保MatrixArray
中的单个矩阵肯定不会在任何漂亮的边界上对齐。但是,根据我的理解,Eigen3.3仍然可以使用未对齐的操作来对这种情况进行矢量化。
任何人都可以提供有关J == 1
时上述示例中发生的情况的见解,并且此矩阵的第一个条目未对齐? Eigen3.3现在是否与等效动态矩阵类似地处理这种情况?我的理解是使用标量或未对齐的操作,直到达到适当的对齐边界,此时将使用完全对齐的操作。或者,由于矩阵未开始对齐,因此没有对齐矢量化的可能性?或者是其他事情完全发生了吗?
感谢您的任何见解,并感谢开发人员维护这样一个强大的库。