我有两个可执行文件: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
Run Code Online (Sandbox Code Playgroud)
这是一个简单的串行程序 ( simple.f90)
program test
implicit none
write(*,*) 'hello'
end
Run Code Online (Sandbox Code Playgroud)
这是一个简单的 shell 脚本 ( ),它首先从orscript.sh获取一些数据,然后执行simplerunrun
#!/bin/sh
#data=`simple` # this works
data=`run` # this does not work
echo "exec run..."
exec run
Run Code Online (Sandbox Code Playgroud)
汇编:
mpiifort run.f90 -o run
mpiifort simple.f90 -o simple
Run Code Online (Sandbox Code Playgroud)
跑过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
Run Code Online (Sandbox Code Playgroud)
使用simple而不是runin script.sh,该命令mpirun -n 2 script.sh有效
exec run...
exec run...
I am 1
I am 0
Run Code Online (Sandbox Code Playgroud)