Eigen: MatrixXd + setZero против calloc - PullRequest
0 голосов
/ 28 мая 2019

Есть ли способ ускорить создание MatrixXd, заполненного нулями? Действительно, рассмотрим этот код

#include <vector>
#include <iostream>
#include <chrono>
#include <ctime>
#include <Eigen/Core>

int main() {
    std::vector<void*> results;
    results.reserve(2000);
    int n = 200;
    auto t0 = std::chrono::system_clock::now();
    for(int i = 0; i < 1000; i++) {
        Eigen::MatrixXd* A = new Eigen::MatrixXd(n,n);
        A->setZero();
        results.push_back(A);        
    }
    auto t1 = std::chrono::system_clock::now();
    for(int i = 0; i < 1000; i++) {
        double* A = (double*)calloc(n * n, sizeof(double));
        results.push_back(A);
    }
    auto t2 = std::chrono::system_clock::now();
    std::chrono::duration<double> t01 = t1-t0;
    std::chrono::duration<double> t12 = t2-t1;
    printf("Eigen+setZero %e calloc %e size %lu\n", t01.count(), t12.count(), results.size());
}

в результате (на моем ноутбуке)

./a.out
Eigen+setZero 5.440070e-01 calloc 1.527000e-03 size 2000

Матрицы строятся с использованием Eigen :: MatrixXd (n, n), за которым следует setZero.

Если посмотреть на время более детально, setZero занимает почти все время (новый - супер быстрый). Есть ли способ ускорить это?

В идеале я хотел бы перейти к тому, что возможно с использованием просто calloc. Memset на самом деле не помогает, он такой же медленный, как setZero. Наконец, я хотел бы иметь MatrixXd, поэтому маршрут Map не идеален.

...