Eigen middleCols () штраф - PullRequest
       9

Eigen middleCols () штраф

0 голосов
/ 25 февраля 2019

если я использую функцию-член матриц Eigen Matrix3Xf myMatrix.middleCols(a, b) с a = 0, b = myMatrix.cols()-1, я получаю штраф за производительность.Конечно, я обычно использую другие значения для a и b, но с этими значениями легче всего сравнить с нормальными матрицами.

Это нормальное поведение?Это так, потому что выравнивание не может быть обеспечено и, следовательно, невозможна векторизация?Я ничего не нашел в документации.

Вот пример кода:

Matrix3Xf a_full = Matrix3Xf::Random(3, 400);
Vector3f v = Vector3f::Random();
RowVectorXf b_full = RowVectorXf::Random(400);

volatile int left = 0, right = 399;
auto& a = a_full.middleCols(left, right);
auto& b = b_full.middleCols(left, right);
//auto& a = a_full;
//auto& b = b_full;

for (float f = 0; f < 1000000; f++)
{
    b += (v.transpose() * a);
}

cout << b.sum();

С этим кодом я получаю время выполнения 8.6 с.Имея = a_full;и b = b_ful;без комментариев время выполнения 7,8 с

1 Ответ

0 голосов
/ 25 февраля 2019

О умножении на константу: https://godbolt.org/z/a_OEEP. У вас есть некоторые издержки, потому что Эйген не может знать, начинаются ли ваши столбцы с выровненной позиции, поэтому он умножает некоторые значения, пока не достигнет выровненной позиции.(Кроме того, в конце есть цикл очистки).Если количество столбцов относительно невелико, это может оказать значительное влияние.

Кроме того, MSVC иногда часто плохо встраивает тривиальные функции.Многое из этого исправлено в ветке разработки (default), но не в 3.3.x, добавлено больше принудительных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...