Мне нужно вычислить много (около 400 тыс.) решений небольших линейных задач наименьших квадратов. Каждая задача содержит от 10 до 300 уравнений всего с 7 переменными. Для решения этих проблем я использую собственную библиотеку. Прямое решение занимает слишком много времени, и я превращаю каждую задачу в решение системы линейных уравнений 7x7, выводя производные вручную.
Я получаю хорошее ускорение, но я хочу снова увеличить производительность.
Я использую vagrind для профилирования своей программы и обнаружил, что операция с наибольшей себестоимостью — это оператор += собственной матрицы. Эта операция требует более десяти вызовов a.ldlt().solve(b);
Я использую этот оператор для составления матрицы A и вектора B каждой системы уравнений
//I cal these code to solve each problem
const int nVars = 7;
//i really need double precision
Eigen::Matrix<double, nVars, nVars> a = Eigen::Matrix<double, nVars, nVars>::Zero();
Eigen::Matrix<double, nVars, 1> b = Eigen::Matrix<double, nVars, 1>::Zero();
Eigen::Matrix<double, nVars, 1> equationCoeffs;
//............................
//Somewhere in big cycle.
//equationCoeffs and z are updated on each iteration
a += equationCoeffs * equationCoeffs.transpose();
b += equationCoeffs * z;
Где z - некоторый скаляр
Итак, мой вопрос: как я могу улучшить производительность этих операций?
PS Извините за мой плохой английский