计算化学公社

标题: 计算集群Intel编译CP2K 2024.1,make时报错undefined reference [打印本页]

作者
Author:
Uus/pMeC6H4-/キ    时间: 2024-10-19 23:28
标题: 计算集群Intel编译CP2K 2024.1,make时报错undefined reference
前帖提到,在某Slurm集群上安装成功的较新CP2K 2024.1跑分子动力学时,速度相比实验室提供的预编译9.1版明显偏慢。鉴于新装的CP2K 2024.1采用gcc编译器和自行随工具链配置的OpenMPI,而旧的9.1版采用Intel编译器和Intel MPI,现欲复原当时的编译环境重新安装一遍。

虽然没有旧9.1版的安装过程记录,但查看arch/local.psmp文件以及运行cp2k.psmp -v的输出,可知其采用Intel OneAPI 2022.3的编译器和MPI。集群上加载相应模块后,icc, icpc, ifort以及mpirun的版本均显示为2021.7,应当是CP2K支持的编译器版本。cmake版本是3.26.5,与以前安装成功的所用一致。另外,集群还可加载fftw/3.3.10_intel-2022.3-impi模块。

在./install_cp2k_toolchain.sh安装工具链时,指定采用intel编译器而不采用gcc编译器,libvori-220621、cosma-2.6.6及其他库基本可以正常安装完毕。然而复制arch文件、source setup后make -j 64 ARCH=local VERSION="ssmp psmp",一段时间后集中报错undefined reference,有两种类型:

  1. /home/xxxxxx/cp2k-2024.1_intel-2022.3-impi/tools/toolchain/install/libvori-220621/lib/libvori.a(bqb_parmset.cpp.o): In function `CBQBParameterSet_Compressor::ToString[abi:cxx11](int) const':
  2. /home/xxxxxx/cp2k-2024.1_intel-2022.3-impi/tools/toolchain/build/libvori-220621/src/bqb_parmset.cpp:132: undefined reference to `std::__cxx11::basic_ostringstream<char, std::char_traits<char>, std::allocator<char> >::basic_ostringstream()'
复制代码
  1. /home/xxxxxx/cp2k-2024.1_intel-2022.3-impi/tools/toolchain/install/libvori-220621/lib/libvori.a(v_unitcell.cpp.o): In function `std::deque<int, std::allocator<int> >::_M_reserve_map_at_back(unsigned long)':
  2. /opt/rh/gcc-toolset-13/root/usr/lib/gcc/x86_64-redhat-linux/13/../../../../include/c++/13/bits/new_allocator.h:135: undefined reference to `std::__throw_bad_array_new_length()'
复制代码


有说法是这两种故障均与C++编译器没有正确连接库、指定标准有关,但检查local.psmp可以确认编译选项中有-lstdc++和-std=c++14。那么如何解决呢?

作者
Author:
abin    时间: 2024-10-20 09:10
本帖最后由 abin 于 2024-10-20 12:14 编辑

slurm仅仅是调度器,
和编译没啥关系?

单机多核心并行还是多机器多核心并行?

多机器通讯采用何种硬件? 你的MPI有无支持特定的硬件?

所在机器操作系统版本?
作者
Author:
Uus/pMeC6H4-/キ    时间: 2024-10-20 12:22
本帖最后由 Uus/pMeC6H4-/キ 于 2024-10-21 20:21 编辑
abin 发表于 2024-10-20 09:10
slurm仅仅是调度器,
和编译没啥关系?

单机多核心并行还是多机器多核心并行?

多机器通讯采用何种硬件? 你的MPI有无支持特定的硬件?

所在机器操作系统版本?

这个计算集群用了root权限不开放的Red Hat Enterprise Linux 8.9系统,提交任务时资源限制为单一节点的2个Intel CPU共112核500GB内存,应为单机多核心并行。

从local.psmp前五行定义的编译器flags看,Intel MPI似乎也参与编译。
  1. CC          = /opt/system/app/intel/2022.3.1/mpi/2021.7.1/bin/mpiicc -cc=icx
  2. CXX         = /opt/system/app/intel/2022.3.1/mpi/2021.7.1/bin/mpiicpc -cxx=icpx
  3. AR          = ar -r
  4. FC          = /opt/system/app/intel/2022.3.1/mpi/2021.7.1/bin/mpiifort -fc=ifort
  5. LD          = /opt/system/app/intel/2022.3.1/mpi/2021.7.1/bin/mpiifort -fc=ifort
复制代码


第二天编辑:原来关键就在CC和CXX这里。在工具链安装的时候只写--with-intel=system会采用比较新的Intel编译指令icx和icpx,这两项配置像上面那样写到local.psmp后make时也会沿用。除--with-intel=system外还添加--with-intel-classic=yes,可以切换为经典编译器的icc和icpc指令,此时工具链和make均正常结束,编译出的cp2k.psmp也能跑。(划掉)感觉这不是此版本Intel编译器的通病,更像是这个特定集群Intel编译器模块的问题,或许切换编译器的解决方法不太有普遍性,仅作记录。(划掉)CP2K的官网也写了,Intel oneAPI 2021.3版的编译器不能支持。




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3