optim c++优化库配置(windows环境,mingw)
windows环境下做科学计算常用的库是blas,lapack,openblas等,这些和矩阵运算有关,代码也是经过高度优化,下面介绍一个轻量的c++版本优化库optim在win环境下的安装使用方法,如果是linux的话可以用包管理器安装依赖,方便很多,这里就不做介绍了。
-
预备软件: mingw 730(笔者将qt5自带的设置为系统全局gcc/g++环境),cmder/git bash(提供linux环境,方便执行),cmake(编译lapack使用),armadillo编译安装(可以先编译安装openblas),Eigen下载安装(其实只需要头文件即可); OpenBlas源码编译安装(https://www.openblas.net/)
-
下载openblas源码,解压,打开cmder终端,执行:
mkdir build cd build cmake -G "MinGW Makefiles" .. cmake-gui .. #使用图形化命令查看编译选项,勾选DYNAMIC_ARCH,可以生成对芯片架构进行指令优化;天天Entry:BUILD_SHARED_LIBS,生成动态链接库 cmake --build . -j 4. #新版cmake已经支持编译命令了 cmake --install . #默认安装至"C:\Program Files (x86)\OpenBLAS",包含bin,include和lib三个文件夹
-
下载lapack开发版本(https://github.com/Reference-LAPACK/lapack,内含blas,cblas,lapacke等,开发版本修复了一些mingw编译出现的错误)并解压,进入解压后的路径,打开cmder终端,执行:
mkdir build
cd build
cmake -G "MinGW Makefiles" ..
cmake-gui .. #使用图形化命令查看编译选项,勾选BUILD SHARED LIBRAIES
cmake --build . -j 4. #新版cmake已经支持编译命令了
cmake --install . #默认安装至"C:\Program Files (x86)\LAPACK",包含bin,include和lib三个文件夹
- 解压armadillo,进入解压后的文件路径,执行:
mkdir build && cd build
cmake -G "MinGW Makefiles" ..
使用cmake命令生成了Makefile文件之后,再次执行cmake-gui 使用gui界面,进行以下操作:
1. 去除勾选DETECT_HDF5,带这个可能会编译失败
2. 指定安装路径CMAKE_INSTALL_PREFIX,默认为/usr
3. 勾选ALLOW_BLAS_LAPACK_MACOS和ALLOW_OPENBLAS_MACOS
4. 添加Entry:ARMA_USE_LAPACK,bool值,设置为true
重新configure和generate,生成Makefile,进行编译安装:
```
cmake --build . --config Release -j 11
cmake --install .
```
-
下载解压optimlib. 按照提示有两种安装方式,编译安装和只使用头文件方式,我选择比较简单的头文件方式安装
sh configure --header-only-version
这样会得到一个文件夹header_only_version,里面包含需要的optim.hpp文件,只要在程序中加入这个头文件就可以了,不过还需定义是armadillo封装还是Eigen封装 -
编译程序的时候需要注意包含optim,armadillo/eigen头文件路径(gcc/g++命令使用参数-I进行控制),armadillo的话还有-larmadillo,官方给出的一些例子还需要链接blas/lapack库,这也是一开始介绍编译安装blas/lapack的原因,链接方式为-L/lapsck/lib -lblad-llspack.
笔者实验过程中还发现需要额外指定链接库-lstdc+±6和-lm,否则编译不通过(32位mingw gcc需要-lstdc+±6) -
示例。选取examples下的logit_reg.cpp作为例子,使用g++编译。该程序文件直接编译会报错,需要做一些修改:
-
该例子使用的是armadillo封装的函数,因此需要在文件开头声明#define OPTIM_ENABLE_ARMA_WRAPPERS,否则编译报错;
-
添加using namespace optim;
-
应该是代码接口有改变,该例子作者还没更新,修改98-99行为:
settings.gd_settings.method = 6; settings.gd_settings.par_step_size = 0.1;
-
编译:
g++ logit_reg.cpp -I../header_only_version -I"D:\Applications\armadillo9.9\include" -L"D:\Applications\armadillo9.9\lib" -larm adillo -lm -L"C:\Program Files (x86)\LAPACK\lib" -lblas -llapack
-
要将
C:\Program Files (x86)\LAPACK\bin
添加至系统环境变量,或者复制libarmadillo.dll至相同目录下,否则会报找不到dll的错误,执行结果为:λ ./a.exe Adam: logit_reg test completed successfully. elapsed time: 0.317003s Adam: true values vs estimates: 1.1564 1.1170 2.4369 2.4629 3.0367 3.0269 2.5988 2.6579 1.6090 1.6532 newton: logit_reg test completed successfully. elapsed time: 0.875063s newton: true values vs estimates: 1.1564 1.1170 2.4369 2.4629 3.0367 3.0269 2.5988 2.6579 1.6090 1.6532
-
tests文件夹里面还有很多例子,官方也提供了一份pdf帮助文档可以学习参考,个人觉得里面的优化算法已经汇总得非常齐全,是很好的学习参考资料。
- 总结:整个安装配置过程中涉及到很多依赖项,optim依赖于armadillo或者eigen,eigen还好,下载后只需用到头文件即可,如果是armadillo的话还需要编译,编译又需要blas/lapack和openblas,当然,在optim使用过程中也需要链接blas/lapack库(试了链接openblas库但还是编译错误)
来源:oschina
链接:https://my.oschina.net/u/4411125/blog/4645415