Eigen + SuperLU + BLAS 计算配置

Eigen 是一个线性算术的C++模板库,包括:vectors, matrices, 以及相关算法。功能强大、快速、优雅以及支持多平台。本人在应用中主要使用其稀疏矩阵及其相应的线性运算的接口,其内部实现了效率不是很高的SparseLU计算接口,同时还开放了多个外部库的计算接口:

  • CholmodSupport module

  • MetisSupport module

  • PardisoSupport module

  • PaStiXSupport module

  • SuiteSparseQR module

  • SuperLUSuppot module

  • UmfPackSupport module

由于计算效率原因需要采用SuperLU接口方式计算A*x=b线性方程组的计算。

配置环境为 Window 7 + MSVC2010

库文件主页:

  • Eigen 3.2.2 : http://eigen.tuxfamily.org/index.php?title=Main_Page

  • SuperLU 4.3 : http://crd-legacy.lbl.gov/~xiaoye/SuperLU/

主要过程及注意点如下:

  1. 编译SuperLU库

    1) 新建工程A(命名SuperLU),将**\SuperLU_4.3\SRC中头文件和源文件添加到工程文件目录中;

    2) 然后在工程 右击 -> 属性 -> 配置属性 -> general -> Configeration Type -> 选择 static Library(.lib),单击创建。或者在建立工程的时候选择直接创建静态库;

    3) 将文件夹**\SuperLU_4.3\SRC添加到 项目 -> 属性 -> C/C++ -> 常规 -> 附加包含目录;

    4) 在Debug模式调试编译

    5)无error后生成Release版本

    这时在工程的Release文件夹下即已经生成lib文件,便是SuperLU用到的静态链接库。

  2. 编译BLAS库

    由于SuperLU需要调用BLAS库中的一些函数,所以需要编译BLAS库。SuperLU官网上说BLAS库速度不快,推荐使用Intel MKL、ATLAS、GotoBLAS。为方便仅以SuperLU下载文件中附带的CBLAS文件夹下的BLAS为例编译,BLAS的编译与前者SuperLU类似。

    1) 新建工程B(命名BLAS),将CBLAS文件夹下的头文件和源文件添加到工程文件目录中,然后将工程属性改为Static Library(.lib)。

    2) 将**\SuperLU_4.3\CBLAS添加到 项目 -> 属性 -> C/C++ -> 常规 -> 附加包含目录;

    3) 在Debug模式下调试编译,成功后生成Release版本。

    注:我在这里一直出错,根本不能编译通过。后来查看了CBLAS下的slu_Cnames.h文件,其内容为

    ../SRC/slu_Cnames.h 。实际上表示CBLAS目录下的slu_Cnames.h文件指向SRC目录下的同名头文件,我直接将SRC/slu_Cnames.h文件复制至CBLAS目录下,重新编译则成功通过。其实也不太清楚为什么此前的文件为什么会编译错误。

  3. Eigen中采用SuperLU

    在**\SuperLU_4.3\SRC添加至工程 附加包含目录 中,将SuperLU.lib和BLAS.lib文件所在目录添加至 项目 -> 属性 -> 链接器 -> 常规 -> 附加库目录;在 项目 -> 属性 -> 链接器 -> 输入 -> 附加依赖项 中添加 SuperLU.lib 和 BLAS.lib;

在使用Eigen的文件中需要包含 #include <Eigen/SuperLUSupport> 即可采用类似SparseLU的方法调用SuperLU了。


参考文章:

【1】 SuperLU使用总结 http://blog.csdn.net/gindar/article/details/8010794




你可能感兴趣的:(Eigen + SuperLU + BLAS 计算配置)