内存效率 - 循环中的Eigen :: VectorXd

时间:2017-05-31 21:06:52

标签: c++ algorithm performance eigen memory-efficient

我有一个Measurement个对象,其中有两个Eigen::VectorXd个成员 - 一个用于position,另一个用于velocity

通过扫描将测量值排列在数据集中 - 即,在每个时间步长,将新的测量值扫描添加到数据集。这些类型定义为:

typedef std::shared_ptr<Measurement>        MeasurementPtr;
typedef std::vector<MeasurementPtr>         scan_t;
typedef std::vector<scan_t>                 dataset_t;

在算法的每次迭代开始时,我需要对每个测量应用新的变换。目前,我有:

for (auto scan = dataset_.begin(); scan != dataset_.end(); ++scan)
    for (auto meas = scan->begin(); meas != scan->end(); ++meas) {

        // Transform this measurement to bring it into the same
        // coordinate frame as the current scan
        if (scan != std::prev(dataset_.end())) {
            core::utils::perspective_transform(T_, (*meas)->pos);
            core::utils::perspective_transform(T_, (*meas)->vel);
        }

    }

perspective_transform定义为

void perspective_transform(const Eigen::Projective2d& T, Eigen::VectorXd& pos) {

    pos = (T*pos.homogeneous()).hnormalized();
}

添加此代码会使计算时间增加40倍,因为我在数据集中运行扫描并在每次扫描中进行50次测量 - 这使得它相当慢。我相信这是因为我有550个小对象,每个对象有2 Eigen个内存写入。我删除了结果写入内存,我的基准测试只显示略有减少 - 这表明这是一个内存效率问题而不是计算瓶颈。

如何加快计算速度?有没有办法首先循环并从Eigen::Matrix创建Eigen::Map然后我可以进行一次计算并拥有它会自动更新所有Measurement个对象的两个成员吗?

1 个答案:

答案 0 :(得分:0)

您可能想要重新编写数据结构。 目前,您有一个结构数组(AOS),具有许多间接性。 数组结构(SOA)通常在内存访问方面更有效。

怎么样?:

struct Scant_t
{
     Eigen::MatrixXd position;
     Eigen::MatrixXd velocity;
}

.rowwise().colwise()运算符可能足够强大,可以进行齐次变换,这样可以节省编写内循环的时间。