前言
本文包含MKL配置、Cmake写法、Eigen中使用MKL的方法。
MKL安装
下载地址:https://software.intel.com/en-us/mkl
解压后使用install_GUI.sh
安装,默认安装路径为/opt/intel/mkl
可选配置项:
- 运行
sudo gedit /etc/ld.so.conf.d/intel_mkl.conf
,添加:
1 | /opt/intel/lib/intel64 |
运行sudo ldconfig
- 运行
sudo gedit /etc/profile
,添加:
1 | export MKL_ROOT_DIR=/opt/intel/mkl |
运行sudo source /etc/profile
,尽量重启电脑以保证生效
Eigen+MKL的cmake写法
工程目录结构
1 | /root |
工程CmakeList.txt写法
其中启用OpenMP通过添加-fopenmp
实现
1 | cmake_minimum_required (VERSION 2.6 FATAL_ERROR) |
FindMKL.cmake写法
代码见文末,参考自链接,做了部分修改,其中set(MKL_LIBRARIES ${MKL_LP_SEQUENTIAL_LIBRARIES})
一行最为关键。
MKL有以下概念:
- 数据格式,LP64和ILP64,其中LP64用于64位系统,ILP用于32位系统
- 线程类型,单线程SEQUENTIAL、GNU多线程GNUTHREAD、Intel多线程INTELTHREAD,Ubuntu下可使用GNU多线程,Win下可使用Intel多线程,对于较低维度的矩阵运算单线程似乎更快
- MPI,分为NOMP、INTELMPI、OPENMPI、SGIMPT四种,本FindMKL.cmake暂未支持配置MPI
Ubuntu下常用配置为
set(MKL_LIBRARIES ${MKL_LP_SEQUENTIAL_LIBRARIES})
单线程set(MKL_LIBRARIES ${MKL_LP_GNUTHREAD_LIBRARIES})
多线程
示例代码
Eigen
1 |
|
Eigen+OpenMP
添加-fopenmp
编译参数,2线程,上一代码添加如下语句:
1 |
|
Eigen+MKL单线程
FindMKL.cmake中使用MKL_LP_SEQUENTIAL_LIBRARIES
,添加#define EIGEN_USE_MKL_ALL
1 | #define EIGEN_USE_MKL_ALL |
Eigen+MKL多线程
FindMKL.cmake中使用MKL_LP_GNUTHREAD_LIBRARIES
,添加#define EIGEN_USE_MKL_ALL
、omp_set_num_threads(2);
,使用2线程
1 |
|
结果对比
由结果可见MKL可显著提升高阶矩阵的运算速度(另外测试发现低阶矩阵速度差别不大),在当前测试环境(i3+4g+Ubuntu15.04)下多线程并没有提升乘法的运算速度
测试项 | 线程 | 时间/秒 |
---|---|---|
Eigen | 1 | 27.1427 |
Eigen+OpenMP | 2 | 31.3295 |
Eigen+MKL单线程 | 1 | 8.43301 |
Eigen+MKL多线程 | 2 | 9.5142 |
其他
添加#define EIGEN_DONT_PARALLELIZE
可使Eigen不适用任何并行加速,但对
Eigen+MKL的配置方式无效,仅对Eigen或Eigen+OpenMP生效。
参考
- http://eigen.tuxfamily.org/dox/TopicPreprocessorDirectives.html
- http://eigen.tuxfamily.org/dox/TopicUsingIntelMKL.html
- https://software.intel.com/en-us/mkl
- https://github.com/Eyescale/CMake/blob/master/FindMKL.cmake
- https://blog.csdn.net/LG1259156776/article/details/52730074?locationNum=6&fps=1
附
FindMKL.cmake
1 | # - Try to find the Intel Math Kernel Library |