Эффективность памяти — Eigen :: VectorXd в цикле

у меня есть 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 объекты?

0

Решение

Возможно, вы захотите переработать ваши структуры данных.
В настоящее время у вас есть массив структур (AOS) с несколькими косвенными ссылками.
Структура массива (SOA) обычно более эффективна при доступе к памяти.

Как насчет ?:

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

.rowwise() а также .colwise() операторы могут быть достаточно мощными, чтобы выполнять однородное преобразование, что избавит вас от написания внутреннего цикла.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]