【问题标题】:CXX ABI Error when running on a cluster在集群上运行时出现 CXX ABI 错误
【发布时间】:2016-07-19 00:45:47
【问题描述】:

我正在尝试在没有 root 权限的旧集群上运行代码。因此,在头节点上我自己的文件夹中,我安装了 gcc 和 OpenMPI 的较新版本的本地副本,我正在使用它来编译我的代码。作为试验,我决定编写一个“hello world”程序并在集群上运行它。当我将此代码编译为

mpic++ --std=c++11 -L/home/sidk/libraries/gcc/lib64 -o mpitrial mpitrial.cpp 

mpitrial.cpp 在哪里

int main(int argc, char *argv[])
{
    int rank=0,size=0;
    MPI_Init(&argc,&argv);  
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    cout<<"Hello from "<<rank<<" of "<<size<<endl;
    MPI_Finalize();
}

然后我通过 PBS 扭矩作业调度程序将这些过程提交到集群。但是,每个进程(可能在集群中的任何节点上)在运行时,都会向我发送一条错误消息:

/lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /shared/users/sidk/mpitrial)

这似乎是说每个进程都与较旧的 C++ 库链接(因为较新的库位于文件夹 /home/sidk/libraries/gcc/lib64 中,而不是上面显示的路径)。在头节点上,我更新了 LD_LIBRARY_PATH 以指向较新的 C++ 库的位置。

有人可以就如何解决此问题提供建议吗?

非常感谢您的帮助,

悉达多

【问题讨论】:

  • “所以我安装了新版本 gcc 的本地副本”......然后“我的猜测是这是因为每个进程都与旧的 C++ 库链接”。这两种说法相互矛盾。如果您使用新版本的 gcc 进行编译和构建,那么生成的可执行文件显然会与新的而非旧的 C++ 库链接。这个问题令人困惑。你需要说得更清楚。
  • 您好,已编辑。我希望它更清楚。我同意生成的可执行文件应该链接到新的 C++ 库。当我在本地机器上简单地使用 mpirun 运行它时,它可以工作,但是当我通过作业调度程序将相同的代码发送到集群时,我得到了上面提到的错误。

标签: c++ parallel-processing cluster-computing openmpi


【解决方案1】:

在二进制文件上使用ldd 来验证libstdc++ 是从这个非默认路径加载的。

假设LD_LIBRARY_PATHldd被执行时设置正确,那么只有两种可能。

1) 尽管LD_LIBRARY_PATH 设置正确,ldd 显示libstdc++ 仍在从 lib64 加载。

最可能的原因是在可执行文件上设置了DT_RPATH,指向/lib64,它覆盖了LD_LIBRARY_PATH。

作为explained hereDT_RPATH 优先于LD_LIBRARY_PATH。更新您的 Makefile 或您正在使用的任何构建工具,以停止生成带有 DT_RPATH 标记的可执行文件。

2) lddLD_LIBRARY_PATH 从非标准位置加载 libstdc++.so 没有问题。在这种情况下,运行可执行文件的任何问题显然都是环境问题。尽管您不这么认为,LD_LIBRARY_PATH 在运行时没有正确设置。

【讨论】:

  • 感谢您的回答。 ldd 输出中的 libstdc++ 行是:libstdc++.so.6 => /home/sidk/libraries/gcc/lib64/libstdc++.so.6 (0x00002b456e4e3000) 这是正确的位置。我对 --inhibit-rpath 选项做了一些阅读,老实说,我不确定如何禁用 DT_RPATH 标记。由于我使用的是 g++ 和 mpi 的非默认版本,我是否应该将新库复制到所有远程节点,以便该路径在所有远程节点上都有效?
  • 重读我的答案。如果ldd 给出正确的结果,则DT_RPATH 没有问题。
【解决方案2】:

我能够让它工作。我发现这个错误的发生是因为集群的设置方式 - 主文件夹存在歧义,每个集群都有一个与头节点的主文件夹同名的主文件夹。因此,计算节点无法访问较新的库(位于头节点的主文件夹中),而是链接到自己的 /lib64。我将所需的库放在所有节点都可以访问的公共暂存空间中,并在提交脚本中将 LD_LIBRARY_PATH 设置为这个位置,现在它可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    相关资源
    最近更新 更多