Почему bash нарушает цикл управления заданиями MPI? - PullRequest
1 голос
/ 05 мая 2019

Я пытаюсь использовать простой скрипт 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 или за объяснение, почему это произошло!

...