Мне нужно вычислить множество (около 400 тыс.) Решений небольших линейных наименьших квадратов. Каждая проблема содержит 10-300 уравнений с 7 переменными. Для решения этих проблем я использую собственную библиотеку. Прямое решение занимает слишком много времени, и я превращаю каждую проблему в решение системы линейных уравнений 7x7, производя мои производные.Eigen: как ускорить a = = coeffs * coeffs.transpose()
Я получаю приятное ускорение, но я хочу увеличить производительность снова.
Я использую vagrind для профилирования своей программы, и я обнаружил, что операция с самой высокой стоимостью самообслуживания является оператором + = собственной матрицы. Эта операция занимает более десяти вызовов a.ldlt(). Solve (b);
Я использую этот оператор, чтобы составить вектор матрицы и 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;
Где г некоторых скалярной
Так что мой вопрос: Как я могу улучшить производительность этих операций?
PS Извините за мой плохой английский
Благодарим за ответ. Но у меня много очень маленьких плотных проблем не один большой и редкий. Также я не могу использовать GPU сейчас = ( –