CXX ABI在群集上运行时出错

时间:2016-07-19 00:45:47

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

我正在尝试在旧群集上运行代码,我没有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 ++库的位置。

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

非常感谢你的帮助,

亚洲时报Siddharth

2 个答案:

答案 0 :(得分:0)

在二进制文件上使用ldd来验证是否正在从此非默认路径加载libstdc++

假设LD_LIBRARY_PATH在执行ldd时设置正确,则只有两种可能性。

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

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

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

2)lddLD_LIBRARY_PATH,从非标准位置加载libstdc++.so而不会出现问题。在这种情况下,运行可执行文件的任何问题显然都是一个环境问题。尽管你不相信,但LD_LIBRARY_PATH在运行时没有正确设置。

答案 1 :(得分:0)

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