我有一个代码,已成功安装在几个使用 PBS 排队系统的计算集群上,但是在使用 SLURM 排队系统将它安装到集群上时遇到了很大的障碍。大部分代码运行良好,但是代码需要提供其文件名(每次计算都会更改),并且它希望将其作为标准输入接收:
character*8 name
read (5,'(a8)') name
我通过以下方式向集群提供此标准输入:
srun_ps $1/$2.exe << EOD
$2
EOD
其中 $1 是可执行文件的路径,$2 是文件名,srun_ps 似乎是集群构建的 mpi-exec 脚本。请注意,这段代码在我与 PBS 排队系统一起使用的集群上运行良好。
但是,我在这里得到的是“读取期间文件结束,单元 5,文件标准输入”错误。
另外,如果我在登录服务器的命令行上运行类似的命令(通过该服务器提交作业):
#helloworld.for
charachter*5 name
read(5,A5) name
write(6,A5) name
命令行:
ifort -o helloworld.exe helloworld.for
./helloworld.exe << EOD
hello
EOD
提供正确的“hello”输出。如果我向集群提交相同的作业,我会再次收到“文件结尾”错误。
完整的作业提交脚本是:
#!/bin/bash
#SBATCH -o /home/Simulation/file.job.o
#SBATCH -D /home/Simulation/
#SBATCH -J file.job
#SBATCH --clusters=mpp1
#SBATCH --get-user-env
#SBATCH --ntasks=12
#SBATCH --time=1:00:00
source /etc/profile.d/modules.sh
/home/script/runjob /home/Simulation/ file
runjob 脚本的相关部分是(脚本的其余部分正在复制相关的输入文件,并在计算完成后清理文件):
#!/bin/sh
time srun_ps $1/$2.exe << EOD
$2
EOD
我意识到这可能是一个完全过于具体的问题,但任何建议都将不胜感激。
大卫。