在Visual Studio 2022中使用英特尔MKL编译Eigen C++

waxmsbnn  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(337)

我有一个为Eigen库构建本地 Package 器的简单项目。
然而,我没有看到任何加速相比,编译相同的库没有MKL。
有人能帮忙吗?
我定义了EIGEN_USE_MKL_ALL,并链接了其他库mkl_core.lib、mkl_intel_thread.lib、mkl_intel_lip64.lib和libiomp5md.lib,如下所示answer

pdtvr36n

pdtvr36n1#

Eigen不会将完整的piv LU分派给MKL或LAPACK。我还没有检查这些库是否提供了这一点。如果你切换到partialPivLU,你应该会看到加速。在我的系统上,MKL在这个测试设置中快了4-5倍。

#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

在Intel i7- 11800 H上测试。阅读汇编验证在完整piv情况下没有调用Lapack函数,而部分piv调用LAPACKE_dgetrf

相关问题