首页 > 解决方案 > “mpirun”调用的 Bash 脚本调用另一个 MPI 可执行文件并崩溃,退出代码为 13

问题描述

我有两个可执行文件:prog1prog2.

这些可执行文件读取输入数据,然后对其进行一些计算。根据输入数据的“类型”,要么使用prog1要么prog2必须使用。

我想为只需要调用的用户简化这一点prog,这是一个 shell 脚本

  1. 检查数据(通过运行prog1),
  2. 运行prog1prog2使用exec.

对于串行程序(无 MPI),这很好用。在 MPI 的情况下,我想progmpirun -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中获取一些数据,然后执行simplerunrun

#!/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而不是runin script.sh,该命令mpirun -n 2 script.sh有效

exec run...
exec run...
 I am           1
 I am           0

标签: shmpiexit-code

解决方案


推荐阅读