在`std :: array`

时间:2017-05-24 09:55:12

标签: c++ eigen

我有一个应用程序需要将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现在是否与等效动态矩阵类似地处理这种情况?我的理解是使用标量或未对齐的操作,直到达到适当的对齐边界,此时将使用完全对齐的操作。或者,由于矩阵未开始对齐,因此没有对齐矢量化的可能性?或者是其他事情完全发生了吗?

感谢您的任何见解,并感谢开发人员维护这样一个强大的库。

0 个答案:

没有答案