#include <Eigen/Dense>
int main()
{
const Eigen::MatrixXd A = Eigen::MatrixXd::Random(500, 500);
const Eigen::VectorXd b = Eigen::VectorXd::Random(500);
const int rep = 200;
Eigen::VectorXd c;
for(int i = 0; i < rep; ++i)
c = A.LU_METHOD().solve(b);
}
部分Piv:
g++ -O3 -I/usr/include/eigen3 -march=native -fopenmp \
-DLU_METHOD=partialPivLu -DEIGEN_USE_MKL_ALL -I${MKLROOT}/include \
-L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 \
-lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl test.cpp
time ./a.out
> real 0m0,221s
> user 0m1,513s
> sys 0m0,019s
g++ -O3 -I/usr/include/eigen3 -march=native -fopenmp \
-DLU_METHOD=partialPivLu test.cpp
time ./a.out
> real 0m0,995s
> user 0m5,719s
> sys 0m3,626s
完整Piv:
g++ -O3 -I/usr/include/eigen3 -march=native -fopenmp \
-DLU_METHOD=fullPivLu -DEIGEN_USE_MKL_ALL -I${MKLROOT}/include \
-L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 \
-lmkl_gnu_thread -lmkl_core -lgomp -lpthread -lm -ldl test.cpp
time ./a.out
> real 0m4,445s
> user 0m4,438s
> sys 0m0,006s
g++ -O3 -I/usr/include/eigen3 -march=native -fopenmp \
-DLU_METHOD=fullPivLu test.cpp
time ./a.out
> real 0m4,510s
> user 0m4,505s
> sys 0m0,005
1条答案
按热度按时间pdtvr36n1#
Eigen不会将完整的piv LU分派给MKL或LAPACK。我还没有检查这些库是否提供了这一点。如果你切换到partialPivLU,你应该会看到加速。在我的系统上,MKL在这个测试设置中快了4-5倍。
部分Piv:
完整Piv:
在Intel i7- 11800 H上测试。阅读汇编验证在完整piv情况下没有调用Lapack函数,而部分piv调用
LAPACKE_dgetrf
。