个人原创,如有转载,请注明出处。——by realasking

最近在联想Legion R7000P 2021款机器上的Manjaro Linux中安装了Quantum Espresso 7.0,希望在平时用作计算脚本测试的平台。结果,将以前的计算脚本拷贝过来,测试时报段错误。错误提示是:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

pw.x的错误提示中看不到任何有用的信息。难道是新版QE语法有变更?经过在其官网仔细核对,没有看到任何语法错误。那是stackmemlock的设置不对?在/etc/security/limits.conf中都设为unlimited仍然如此。还是说我的编译设置有问题?对照configure和官网的内容检查了PKGBUILD文件中的参数,没有问题。

在彷徨无计之际,就想到在HP的星13Air上试试,万一是显卡原因呢?结果相同的PKGBUILD编译出来的QE在HP这机器上很顺利的跑起来了。于是我又在联想这机器上修改PKGBUILD以关闭显卡支持后再编译,但运行时仍然报段错误。不过这个时候,我有了两个可以对比的对象。在两台电脑上分别用ldd检查链接库,发现联想机器上QE用的数学库链接到了intel-mklOneAPI,但系统的scalapack链接到的是lapackblas,而在HP的机器上,他们都链接到的lapackblas

问题找到了就好办了,在联想机器上先卸载intel的数学库,以及与之相关的程序,然后编译安装QE,再将那些程序装回去即可。在这个过程中,需要下载openmpiPKGBUILD和源代码,稍作修改后重新编译一个不含cuda支持的版本,或者编译使用mpich的包来提供mpi

之所以会遇到这个问题,是因为联想的机器有nvidia RTX-3050Ti显卡,安装tensorflow的时候,会将cudaIntel OneAPI相关的东西都装上,但是Manjaro Linux提供的OneAPI包并未提供Intel版的scalapack,导致QE编译时安装的scalapack又是原始版本的,在数学库调用时就产生了冲突。