如果可执行文件在两个或多个节点上运行,为什么它不能看到环境变量?

Why can't and environment variable be seen by an executable if it is run on two or more nodes?

本文关键字:为什么 运行 不能 环境变量 节点 可执行文件 两个 如果      更新时间:2023-10-16

我正在用C++编写一个程序(我称之为"启动器"),使用MPI来"生成"第二个可执行文件("从文件")。根据集群可用于启动器的节点数量,它将在每个节点上启动从节点,并且从节点也将通过MPI与启动器进行通信。当从节点完成计算后,它会"告诉"启动器该节点现在可用,并且启动器为自由节点生成另一个从节点。重点是在一组异构的机器上运行1000个独立的计算,这些计算依赖于第二个可执行文件。

这是在我自己的计算机上工作的,在那里我创建了一个"假"机器文件(或主机文件),为程序提供两个节点:localhost和localhost。发射器产生两个从体,当其中一个结束时,另一个从体被发射。这告诉我产卵过程工作正常。

当我把它移到实验室的集群中时(使用torque/maui来管理它),如果我要求1(一)个节点,它也会起作用。如果我要求更多,我会得到一个丢失的库错误(准确地说是libimf.so。来自英特尔编译器的库)。lib在那里,节点可以看到它,因为如果我只要求一个节点,程序就会运行。

我的PBS看起来是这样的:

#!/bin/bash
#PBS -q small 
#PBS -l nodes=1:ppn=8:xeon
#PBS -l walltime=1:00:00
#PBS -N MyJob
#PBS -V 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpich2.shared.exec/lib/:/opt/intel/composerxe-2011.3.174/compiler/lib/intel64/:/usr/local/boost/lib/
log_file="output_pbs.txt"
cd $PBS_O_WORKDIR
echo "Beginning PBS script." > $log_file
echo "Executing on hosts ($PBS_NODEFILE): " >> $log_file
cat $PBS_NODEFILE >> $log_file
echo "Running your stuff now!" >> $log_file
# mpiexec is needed in order to let "launcher" call MPI_Comm_spawn.
/usr/local/mpich2.shared.exec/bin/mpiexec -hostfile $PBS_NODEFILE -n 1 /home/user/launhcer --hostfile $PBS_NODEFILE -r 1 >> $log_file 2>&1
echo "Fim do pbs." >> $log_file

当我尝试两个或多个节点时,启动器不会产生任何可执行文件。我得到这样的输出:

Beginning PBS script.
Executing on hosts (/var/spool/torque/aux//2742.cluster): 
node3
node3
node3
node3
node3
node3
node3
node3
node2
node2
node2
node2
node2
node2
node2
node2
Running your stuff now!
(Bla bla bla from launcher initialization)
Spawning!
/usr/local/mpich2.shared.exec/bin/hydra_pmi_proxy: error while loading shared libraries: libimf.so: cannot open shared object file: No such file or directory

我在邮件列表中发现了另一个人有类似我的问题,但没有解决方案。(http://lists.mcs.anl.gov/pipermail/mpich-discuss/2011-July/010442.html)。唯一的答案是尝试查找节点是否可以看到lib(如果存储lib的目录安装在节点上),所以我尝试了

ssh node2 ls /opt/intel/composerxe-2011.3.174/compiler/lib/intel64/libimf.so >> $log_file

在我的PBS脚本中,lib存在于节点可以看到的文件夹中。

在我看来,torque/maui似乎没有将环境变量导出到所有节点(尽管我不知道为什么不会),所以当我试图使用MPI_Spawn在另一个节点中运行另一个可执行文件时,它找不到lib。这有道理吗?如果是,你能提出一个解决方案吗?有人能提出其他想法吗?提前感谢,Marcelo

编辑:

根据其中一个答案中的建议,我安装了OpenMPI,用mpiexec测试选项"-x VARNAME"。在PBS脚本中,我将执行行更改为:

/usr/local/openmpi144/bin/mpiexec -x LD_LIBRARY_PATH -hostfile $PBS_NODEFILE -n 1 /var/dipro/melomcr/GSAFold_2/gsafold --hostfile $PBS_NODEFILE -r 1 >> $log_file 2>&1

但收到以下错误消息:

[node5:02982] [[3837,1],0] ORTE_ERROR_LOG: A message is attempting to be sent to a process whose contact information is unknown in file rml_oob_send.c at line 105
[node5:02982] [[3837,1],0] could not get route to [[INVALID],INVALID]
[node5:02982] [[3837,1],0] ORTE_ERROR_LOG: A message is attempting to be sent to a process whose contact information is unknown in file base/plm_base_proxy.c at line 86

从互联网上我可以了解到,这个错误通常来自多次执行mpiexec,比如在/path/to/mpiexec mpiexec -n 2 my_program中,但我的情况并非如此。

我想我应该补充一点,派生的"slave"程序使用端口与"launcher"程序通信。launcher打开一个带有MPI_Open_port和MPI_Comm_accept的端口,然后在slave运行MPI_Comm_connect时等待slave程序连接。

正如我上面所说的,当我只要求一个节点时,所有这些都能工作(使用MPICH2)。使用OpenMPI,当我只要求一个节点时,我会得到上面的错误甚至

你是对的。远低于集群软件的远程处理调用不传输环境变量。

您可以使用-x选项来mpiexec将环境变量传递给其他节点。