Я пытаюсь использовать простой скрипт bash для последовательного запуска пакета заданий MPI. Этот скрипт отлично работает при запуске последовательного кода (я использую Fortran 90), но по какой-то причине bash выходит из цикла, когда я пытаюсь выполнить код MPI.
Я уже нашел обходной путь к проблеме. Я просто написал практически тот же сценарий на Perl, и он работал как шарм. Я просто очень хочу понять проблему здесь, потому что я предпочитаю простоту bash, и она идеально подходит для моих собственных потребностей сценариев почти во всех других случаях.
Я попытался запустить код MPI в качестве фонового процесса и использовать ожидание с тем же результатом. Если я запускаю задания в фоновом режиме, не используя ожидание, bash не выходит из цикла, а складывает задания до тех пор, пока в конечном итоге не рухнет. Цель состоит в том, чтобы запустить исполняемый файл последовательно для каждого набора параметров в любом случае, я просто хотел отметить, что в этом случае цикл не прерывается.
Bash Script, interp.sh: Использование -> $ ./interp.sh inputfile
#!/bin/bash
PROG=$1
IFILE=$2
kount=0 # Counter variable for looping through input file
sys=0 # Counter variable to store how many times model has been run
while IFS="\n" read -r line
do
kount=$(( $kount + 1 ))
if [ $(( kount % 2 )) -eq 1 ] # if kount is even, then expect headers
then
unset name defs
sys=$(( $sys + 1 ))
name=( $line ) # parse headers
defs=${#name[*]}
k=$(( $defs - 1 ))
else # if count is odd, then expect numbers
unset vals
vals=( $line ) # parse parameters
for i in $( seq 0 $k )
do
# Define variables using header names and set their values
printf -v "${name[i]}" "${vals[i]}"
done
# Print input variable values
echo $a $b $c $d $e $nPROC
# Run executable
mpiexec -np $nPROC --oversubscribe --hostfile my_hostfile $PROG
fi
done < $IFILE
Входной файл, input.dat:
a b c d e nPROC
1 2 3 4 5 2
nPROC
3
nPROC
4
nPROC
5
nPROC
6
nPROC
7
nPROC
8
Пример кода MPI f90, main.f90:
program main
use mpi
implicit none
integer :: i, ierr, myID, nPROC
integer, parameter :: foolen = 100000
double precision, dimension(0:foolen) :: foo
call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nPROC, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, myID, ierr)
if ( myID .eq. 0 ) then
do i=0,foolen
foo(i) = i
end do
else
do i=0,foolen
foo(i) = i
end do
end if
call MPI_FINALIZE(ierr)
end program
Пример make-файла:
COMP=mpif90
EXT=f90
CFLAGs=-Wall -Wextra -Wimplicit-interface -fPIC -fmax-errors=1 -g -fcheck=all \
-fbacktrace
MPIflags=--oversubscribe --hostfile my_hostfile
PROG=main.x
INPUT=input.dat
OUTPUT=output
OBJS=main.o
$(PROG): $(OBJS)
$(COMP) $(CFLAGS) -o $(PROG) $(OBJS) $(LFLAGS)
main.o: main.f90
$(COMP) -c $(CFLAGs) main.f90
%.o: %.f90
$(COMP) -c $(CFLAGs) $<
run:
make && make clean
./interp.sh $(PROG) $(INPUT)
clean:
rm -f *.o DONE watch
my_hostfile
localhost slots=4
Обратите внимание, что если строка mpiexec закомментирована, сценарий выполняется должным образом. Вывод выглядит так:
1 2 3 4 5 2
1 2 3 4 5 3
1 2 3 4 5 4
1 2 3 4 5 5
1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 5 8
Это значения параметров, которые должны передаваться в код MPI в каждом цикле. Однако когда в скрипте вызывается mpiexec, читается и передается только первый набор параметров.
Я прошу прощения, если все это немного чрезмерно, я просто хотел предоставить все, что нужно для тестирования. Будем весьма благодарны за любую помощь в решении проблемы в bash или за объяснение, почему это произошло!