Armadillo C++无法对大矩阵进行对角化



我正在使用C++的Armadillo线性代数库,在使用SLURM操作的集群上对角化高达65k x 65k的大矩阵。对于大于30k x 30k的矩阵,我得到以下错误消息:

Intel MKL ERROR: Parameter 9 was incorrect on entry to DSYTRD.
Intel MKL ERROR: Parameter 8 was incorrect on entry to DSTEDC.
Intel MKL ERROR: Parameter 12 was incorrect on entry to DORMTR.

我认为这可能是由于使用int32而不是int64造成的,尽管我启用了arma宏arma_USE_64bit、arma_USE_BLASS_LONG_LONG等,所以内部代码应该对64位整数进行操作。这是我的汇编行

g++ main.cpp IsingModel.cpp IsingModel_disorder.cpp IsingModel_sym.cpp tools.cpp user_interface.cpp -o Ising.o -pthread -I../LIBRARIES_CPP/armadillo-10.8.0/include/ 
-L${MKLROOT}/lib/intel64 -fopenmp -lmkl_intel_lp64 -lmkl_core -lmkl_intel_ilp64
-lmkl_sequential  -lpthread -lm -lmkl_gnu_thread -lstdc++fs -llapack -fcx-fortran-rules
-fomit-frame-pointer -lblas -std=c++20 -std=c++17 -O3

对于那些知道SLURM的人,这里是我正在使用的模块:

module load Armadillo/9.900.1-foss-2020a
module load imkl/2021.4.0
module load OpenBLAS/0.3.18-GCC-11.2.0

感谢您提前提供的帮助!

对不起,我没有足够的声誉在下面发表评论,所以我必须给出答案。

在我使用Armadillo的过程中,我发现当前版本的Armdillo和英特尔MKL无法正常工作,并且可能存在漏洞(Ubuntu 20(。事实上,已经有很多关于这方面的报道,但我们很难做任何事情,因为正是Armadillo图书馆与这些图书馆相连。也许这对开发人员来说是个问题。

我自己发现OpenBlas是"英特尔MKL"的一个很好的替代方案,可以作为对Armadillo的支持。它真的很有效率。此外,如果你有一个英伟达GPU,NVBlas可以很好地与OpenBlas配合使用。(我的回答中详细介绍了将NVBlas与OpenBlas一起使用的cmake解决方案。(如果使用cmake安装Armadillo库,请稍微更改CmakeLists.txt文件以禁用MKL的检测。

CMake解决方案

如果安装了MKL,并且它在链接过程中一直出现问题,可以通过编辑CCD_ 3文件来禁用对MKL的支持,删除CCD_ 4并重新运行基于cmake的安装。(Armadillo自述(

CMakeLists.txt中,注释掉包含以下内容的行(第327行(:

INCLUDE(ARMA_FindMKL)

g++溶液

使用g++,删除"英特尔MKL"的链接库,将-lopenblas用于OpenBlas

g++ main.cpp IsingModel.cpp IsingModel_disorder.cpp IsingModel_sym.cpp tools.cpp 
user_interface.cpp -o Ising.o -pthread -I../LIBRARIES_CPP/armadillo-10.8.0/include/ 
-fopenmp -lpthread -lm -lstdc++fs -llapack -fcx-fortran-rules 
-fomit-frame-pointer -lblas -lopenblas -std=c++20 -O3

最新更新