ARPACK采用Arnoldi算法求解大型稀疏矩阵特征值。本文拟记录在Windows下编译安装ARPACK的流程。
零、环境
操作系统 | Windows 10 |
集成开发环境 | Visual Studio 2019 Community |
CMake | 3.24.2 |
Intel oneAPI BaseKit | w_BaseKit_p_2023.1.0.47256_offline |
Intel oneAPI HPCKit | w_HPCKit_p_2023.1.0.46357_offline |
一、依赖项
1.1 Intel oneAPI
由于oneAPI HPCKit依赖于oneAPI BaseKit,因此,需要首先下载安装oneAPI BaseKit,然后再安装oneAPI HPCKit。
1.2 Ninja
即便将CC、CMAKE_C_COMPILER配置为icl,Visual Studio 2019仍旧使用Visual Studio 2019自带的编译器cl,而不会使用Intel oneAPI的C/C++编译器。
目前oneAPI提供了对CMake Ninja Generator来进行构建的支持。若要使用Intel oneAPI C/C++编译器,需要使用Ninja。目前,Visual Studio 2019已经提供了对Ninja的支持。
二、方案1:使用VS编译ARPACK
2.1 下载ARPACK
git clone https://github.com/opencollab/arpack-ng.git
cd ./arpack-ng/
git checkout -b arpack-3.9.0 3.9.0
2.2 构建工程
打开cmd命令行窗口,通过"C:\Program Files (x86)\Intel\oneAPI\setvars.bat"配置oneAPI环境变量,
然后再运行"cmake-gui",打开cmake界面,按照以下配置构建项目,
Where is the source code | D:/YouQuan/CaeFrameworks/ARPACK/arpack-ng |
Where to build the binaries | D:/YouQuan/CaeFrameworks/ARPACK/BUILD/arpack-ng |
CMAKE_INSTALL_PREFIX | D:/YouQuan/CaeFrameworks/ARPACK/INSTALL/arpack-ng |
ICB | TRUE |
INTERFACE64 | TRUE |
2.3 配置arpack.sln
创建"D:\YouQuan\CaeFrameworks\ARPACK\BUILD\arpack-ng\arpack-ng_exports.def",填写如下内容,
LIBRARY arpack.dll
EXPORTS
cmout_
cvout_
dgetv0_
dmout_
dnaitr_
dnapps_
dnaup2_
dnaupd_
dnconv_
dneigh_
dneupd_
dngets_
dsaitr_
dsapps_
dsaup2_
dsaupd_
dsconv_
dseigt_
dsesrt_
dseupd_
dsgets_
dsortc_
dsortr_
dstatn_
dstats_
dstqrb_
dvout_
icnteq_
iswap_
ivout_
arscnd_
smout_
zgetv0_
znaitr_
znapps_
znaup2_
znaupd_
zneigh_
zneupd_
zngets_
zsortc_
zstatn_
打开arpack.sln,按照如下配置arpack项目属性,
[Fortran]/[External Procedures]/[Calling Convention] | C, REFERENCE (/iface:cref) |
[Fortran]/[External Procedures]/[Append Underscore to Extrnal Nam] | Yes (/assume:underscore) |
[Linker]/[Input]/[Module Definition File] | arpack-ng_exports.def |
按照如下配置bug_1323、bug_142、bug_142_gen、bug_58_double、bug_79_double_complex、dnsimp_test等项目属性
[Fortran]/[External Procedures]/[Calling Convention] | C, REFERENCE (/iface:cref) |
[Fortran]/[External Procedures]/[Append Underscore to Extrnal Nam] | Yes (/assume:underscore) |
将然后在VS中右键"ALL_BUILD"完成编译,然后右键"INSTALL"完成安装。
三、方案2:使用Ninja编译安装ARPACK
3.1 下载ARPACK
git clone https://github.com/opencollab/arpack-ng.git
cd ./arpack-ng/
git checkout -b arpack-3.9.0 3.9.0
3.2 构建工程
打开cmd命令行窗口,通过"C:\Program Files (x86)\Intel\oneAPI\setvars.bat"配置oneAPI环境变量,
输入以下命令,构建工程,
cmake -DCMAKE_C_COMPILER=icl -DCMAKE_CXX_COMPILER=icl -DCMAKE_INSTALL_PREFIX=D:/YouQuan/CaeFrameworks/ARPACK/INSTALL/arpack-ng -DICB=TRUE -DINTERFACE64=TRUE -GNinja D:\YouQuan\CaeFrameworks\ARPACK\arpack-ng
运行以下命令,编译ARPACK
cmake --build .
运行以下命令,安装ARPACK
cmake --install .
3.3 生成lib文件
将"D:/YouQuan/CaeFrameworks/ARPACK/arpack-ng/VISUAL_STUDIO/arpack-ng_exports.def"拷贝到"D:\YouQuan\CaeFrameworks\ARPACK\BUILD\arpack-ng",然后运行以下命令生成arpack.lib文件,
lib /def:arpack-ng_exports.def /machine:x64 /out:arpack.lib
四、方案3:使用自带VS工程编译ARPACK
实际上,arpack-ng/VISUAL_STUDIO目录已经包含了一个arpack-ng.sln用于构建arpack-ng,但是,该arpack-ng.sln却依赖NetLib实现的BlAS、LAPACK。
为了使用使用Intel oneAPI的BLAS、LAPACK,需要配置自带的arpack-ng.sln,打开arpack-ng.sln之后,右键"arpack-ng",打开其属性配置,在[Linker]/[Input]/[Additional Dependencies]中输入以下依赖,
libiomp5md.lib mkl_core_dll.lib mkl_intel_lp64_dll.lib mkl_intel_thread_dll.lib
然后,在VS中编译arpack-ng项目即可。
网络资料
ARPACKhttps://github.com/opencollab/arpack-ng
Get the Intel® oneAPI Base Toolkithttps://www.intel.com/content/www/us/en/developer/tools/oneapi/base-toolkit-download.htmlGet the Intel® oneAPI HPC Toolkit
https://www.intel.com/content/www/us/en/developer/tools/oneapi/hpc-toolkit-download.html
CMake Generators https://cmake.org/cmake/help/v3.24/manual/cmake-generators.7.html#id12