optim c++优化库配置(windows环境,mingw)

[亡魂溺海] 提交于 2020-10-02 21:13:50

optim c++优化库配置(windows环境,mingw)
windows环境下做科学计算常用的库是blas,lapack,openblas等,这些和矩阵运算有关,代码也是经过高度优化,下面介绍一个轻量的c++版本优化库optim在win环境下的安装使用方法,如果是linux的话可以用包管理器安装依赖,方便很多,这里就不做介绍了。

  1. 预备软件: mingw 730(笔者将qt5自带的设置为系统全局gcc/g++环境),cmder/git bash(提供linux环境,方便执行),cmake(编译lapack使用),armadillo编译安装(可以先编译安装openblas),Eigen下载安装(其实只需要头文件即可); OpenBlas源码编译安装(https://www.openblas.net/)

  2. 下载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三个文件夹
    
  3. 下载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三个文件夹
  1. 解压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 .
 ```
  1. 下载解压optimlib. 按照提示有两种安装方式,编译安装和只使用头文件方式,我选择比较简单的头文件方式安装
    sh configure --header-only-version
    这样会得到一个文件夹header_only_version,里面包含需要的optim.hpp文件,只要在程序中加入这个头文件就可以了,不过还需定义是armadillo封装还是Eigen封装

  2. 编译程序的时候需要注意包含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)

  3. 示例。选取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帮助文档可以学习参考,个人觉得里面的优化算法已经汇总得非常齐全,是很好的学习参考资料。

  1. 总结:整个安装配置过程中涉及到很多依赖项,optim依赖于armadillo或者eigen,eigen还好,下载后只需用到头文件即可,如果是armadillo的话还需要编译,编译又需要blas/lapack和openblas,当然,在optim使用过程中也需要链接blas/lapack库(试了链接openblas库但还是编译错误)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!