Оптимизация умножения матриц - PullRequest
4 голосов
/ 15 мая 2019

Я выполняю серию матричных умножений с довольно большими матрицами.Выполнение всех этих операций занимает много времени, и мне нужна моя программа, чтобы сделать это в большом цикле.Мне было интересно, есть ли у кого-нибудь идеи, чтобы ускорить это?Я только начал использовать Eigen, поэтому у меня очень ограниченные знания.

Я использовал ROOT-cern, встроенный в класс TMatrix, но скорость выполнения матричных операций очень низкая.Я настроил некоторые диагональные матрицы, используя Eigen, в надежде, что он обработал операцию умножения более оптимальным способом.Возможно, но я не вижу разницы в производительности.

// setup matrices
int size = 8000;

Eigen::MatrixXf a(size*2,size);

// fill matrix a....

Eigen::MatrixXf r(2*size,2*size); // diagonal matrix of row sums of a

// fill matrix r

Eigen::MatrixXf c(size,size); // diagonal matrix of col sums of a

// fill matrix c

// transpose a in place
a.transposeInPlace();

Eigen::MatrixXf c_dia;
c_dia = c.diagonal().asDiagonal();

Eigen::MatrixXf r_dia;
r_dia = r.diagonal().asDiagonal();

// calc car
Eigen::MatrixXf car;
car = c_dia*a*r_dia;

1 Ответ

6 голосов
/ 15 мая 2019

Вы делаете слишком много работы здесь. Если у вас есть диагональные матрицы, сохраняйте только диагональ (и используйте ее непосредственно для продуктов). Как только вы сохраните диагональную матрицу в квадратной матрице, информация о структуре будет потеряна для Eigen.

Кроме того, вам не нужно хранить транспонированный вариант a, просто используйте a.transpose() внутри продукта (здесь это незначительная проблема ...)

// setup matrices
int size = 8000;

Eigen::MatrixXf a(size*2,size);

// fill matrix a....
a.setRandom();

Eigen::VectorXf r = a.rowwise().sum(); // diagonal matrix of row sums of a
Eigen::VectorXf c = a.colwise().sum(); // diagonal matrix of col sums of a

Eigen::MatrixXf car = c.asDiagonal() * a.transpose() * r.asDiagonal();

Наконец, конечно, убедитесь, что компилируете с включенной оптимизацией и включите векторизацию, если она доступна (с компиляцией gcc или clang с -O2 -march=native).

...