我正在尝试在旧群集上运行代码,我没有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
答案 0 :(得分:0)
在二进制文件上使用ldd
来验证是否正在从此非默认路径加载libstdc++
。
假设LD_LIBRARY_PATH
在执行ldd
时设置正确,则只有两种可能性。
1)尽管LD_LIBRARY_PATH
设置正确,但ldd
显示仍然从lib64加载libstdc++
。
最可能的原因是在可执行文件上设置了DT_RPATH
,指向/lib64
,它覆盖了LD_LIBRARY_PATH。
作为explained here,DT_RPATH
优先于LD_LIBRARY_PATH
。更新您的Makefile
或您正在使用的任何构建工具,以停止使用DT_RPATH
标记生成可执行文件。
2)ldd
,LD_LIBRARY_PATH
,从非标准位置加载libstdc++.so
而不会出现问题。在这种情况下,运行可执行文件的任何问题显然都是一个环境问题。尽管你不相信,但LD_LIBRARY_PATH
在运行时没有正确设置。
答案 1 :(得分:0)
我能够让它发挥作用。我发现这个错误正在发生,因为集群的设置方式 - 主文件夹存在歧义,每个集群都有一个与头节点的主文件夹同名的主文件夹。因此,计算节点无法访问较新的库(位于头节点的主文件夹中),而是链接到自己的/ lib64。我将所需的库放在所有节点都可访问的公共暂存空间中,并在提交脚本中将LD_LIBRARY_PATH设置为此位置,现在可以正常工作。