sh - “mpirun”调用的 Bash 脚本调用另一个 MPI 可执行文件并崩溃,退出代码为 13
问题描述
我有两个可执行文件:prog1
和prog2
.
这些可执行文件读取输入数据,然后对其进行一些计算。根据输入数据的“类型”,要么使用prog1
要么prog2
必须使用。
我想为只需要调用的用户简化这一点prog
,这是一个 shell 脚本
- 检查数据(通过运行
prog1
), - 运行
prog1
或prog2
使用exec
.
对于串行程序(无 MPI),这很好用。在 MPI 的情况下,我想prog
用mpirun -n 2 prog
. 然后,两个进程调用 shell 脚本。如果步骤 (1) 涉及运行另一个 MPI 可执行文件,则会失败。
一个简单的解决方案是编译prog1
(用于第 1 步)的串行版本并改用此版本。但是,如果我可以只使用我已经拥有的 MPI 可执行文件,那对我来说会简单得多。
下面,我给出一个非常简单的测试用例。
提前致谢!
我在互联网上找到了类似的问题,但没有一个真正帮助我。
最接近的来自英特尔论坛: https ://software.intel.com/en-us/forums/intel-clusters-and-hpc-technology/topic/754976 (遗憾的是没有回复)
这是一个最小的 MPI 程序 ( run.f90
):
program run
use mpi
implicit none
integer::num_process,rank,ierr;
call MPI_Init(ierr);
call MPI_Comm_rank(MPI_COMM_WORLD, rank,ierr);
call MPI_Comm_size(MPI_COMM_WORLD, num_process,ierr);
write(*,*) 'I am',rank
call MPI_Finalize(ierr);
end program
这是一个简单的串行程序 ( simple.f90
)
program test
implicit none
write(*,*) 'hello'
end
这是一个简单的 shell 脚本 ( ),它首先从orscript.sh
中获取一些数据,然后执行simple
run
run
#!/bin/sh
#data=`simple` # this works
data=`run` # this does not work
echo "exec run..."
exec run
汇编:
mpiifort run.f90 -o run
mpiifort simple.f90 -o simple
运行:script.sh
_mpirun
该命令mpirun -n 2 script.sh
失败
exec run...
exec run...
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 21258 RUNNING AT iff822
= EXIT CODE: 13
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Broken pipe (signal 13)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions
使用simple
而不是run
in script.sh
,该命令mpirun -n 2 script.sh
有效
exec run...
exec run...
I am 1
I am 0
解决方案
推荐阅读
- javascript - ChartJS – 将基线设置在零以上
- c - 如何连接 boost/network/uri
- angular - Angular:在路由之间重用页面骨架
- html - 如何使固定侧导航栏在 html/css 上移动到右侧?
- java - 在保留所有信息的情况下隐藏和显示其他类的 javafx 阶段
- video - 用于在移动设备上自动播放 YouTube 视频的完整、精确的代码?
- csv - 使用 Azure 数据工厂从 blob 存储中仅读取一个文件并加载到数据库中
- postgresql - 在 postgresql 中声明时间戳 sa 数据类型时出现以下错误
- ruby - Ruby CSV - 检索每行解析的原始原始行?
- python - 通过python中的某些特定模式将列表分解为嵌套列表