Узкое место в Eigenpart_lu_inplace при факторизации большого количества маленьких матриц - PullRequest
0 голосов
/ 14 ноября 2018

Мне нужно разложить ~ 1e05 маленьких матриц максимальных переменных размером 20х20. Профилирование факторизации матрицы с использованием HpcToolkit показывает, что горячая точка в коде находится в Eigen::internal::partial_lu_inplace.

Я проверил Собственную документацию по декомпозиции матрицы на месте , и я понимаю, что для больших матриц может быть важно использовать декомпозицию на месте, повторно использовать память и иметь лучшую эффективность кэширования.

В настоящее время я вычисляю разложение следующим образом:

// Factorize the matrix.
matrixFactorization_ = A_.partialPivLu(); 

Профилирование с помощью HpcToolkit показывает, что факторизация на месте является горячей точкой:

enter image description here

Можно ли отключить декомпозицию на месте и проверить, будет ли код быстрее для небольших матриц, с которыми я имею дело?

Примечание. Если вы посмотрите на процессорное время в столбце изображения, вы заметите, что время выполнения - в секундах: здесь я не оптимизирую микросекунды, вычисление занимает ~ 4 секунды.

Редактировать : HPCToolkit статистически профилирует код в полностью оптимизированном режиме -O3, но с информацией, необходимой для сопоставления измерений с исходным кодом -g3.

1 Ответ

0 голосов
/ 14 ноября 2018

Если профилировщик предоставляет вам столь подробную информацию, то вы забыли включить оптимизацию компилятора (например, -O3 -march = native -DNDEBUG или режим «Release» + / arch: AVX с VS).С Eigen это будет иметь огромное значение.

Тогда вы можете сохранить динамическое распределение памяти, используя:

typedef Matrix<double,Dynamic,Dynamic,ColMajor,20,20> MatMax20;
MatMax20 A_;
PartialPivLU<MatMax20> matrixFactorization_;

Матрица A_ и все внутренние компоненты PartialPivLU будут, таким образом,статически распределенный.

Для обновления существующего факто лучше написать:

matrixFactorization_.compute(A_);
...