[原创]Intel数学库引起Manjaro上Quantum Espresso段错误问题的解决
个人原创,如有转载,请注明出处。——by realasking
最近在联想Legion R7000P 2021款机器上的Manjaro Linux中安装了Quantum Espresso 7.0,希望在平时用作计算脚本测试的平台。结果,将以前的计算脚本拷贝过来,测试时报段错误。错误提示是:
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
从pw.x
的错误提示中看不到任何有用的信息。难道是新版QE
语法有变更?经过在其官网仔细核对,没有看到任何语法错误。那是stack
和memlock
的设置不对?在/etc/security/limits.conf
中都设为unlimited
仍然如此。还是说我的编译设置有问题?对照configure
和官网的内容检查了PKGBUILD
文件中的参数,没有问题。
在彷徨无计之际,就想到在HP的星13Air上试试,万一是显卡原因呢?结果相同的PKGBUILD
编译出来的QE
在HP这机器上很顺利的跑起来了。于是我又在联想这机器上修改PKGBUILD
以关闭显卡支持后再编译,但运行时仍然报段错误。不过这个时候,我有了两个可以对比的对象。在两台电脑上分别用ldd
检查链接库,发现联想机器上QE
用的数学库链接到了intel-mkl
和OneAPI
,但系统的scalapack
链接到的是lapack
和blas
,而在HP的机器上,他们都链接到的lapack
和blas
。
问题找到了就好办了,在联想机器上先卸载intel
的数学库,以及与之相关的程序,然后编译安装QE
,再将那些程序装回去即可。在这个过程中,需要下载openmpi
的PKGBUILD
和源代码,稍作修改后重新编译一个不含cuda
支持的版本,或者编译使用mpich
的包来提供mpi
。
之所以会遇到这个问题,是因为联想的机器有nvidia RTX-3050Ti
显卡,安装tensorflow
的时候,会将cuda
和Intel OneAPI
相关的东西都装上,但是Manjaro Linux
提供的OneAPI
包并未提供Intel
版的scalapack
,导致QE
编译时安装的scalapack
又是原始版本的,在数学库调用时就产生了冲突。