Bash 파일에서 for 루프 병렬화

Bash 파일에서 for 루프 병렬화

제 생각에는병렬화아래 bash 스크립트의 for 루프입니다.


두 개의 Matlab 스크립트가 있습니다

1) 메인.엠

clear
rng default
P=2;
grid=randn(2,3);
jobs=1;

2) FM

sgetasknum_grid=grid(jobs*(str2double(getenv('SGE_TASK_ID'))-1)+1: str2double(getenv('SGE_TASK_ID'))*jobs,:); %jobsx3

result=sgetasknum_grid+1; 

filename = sprintf('result.%d.mat', ID);
save(filename, 'result')

exit

내가 하고 싶은 것:

  • main.m을 실행하고 싶습니다.

  • 그럼 FM을 두 번 하고 싶어요평행하게

  • 모든 것이 노드에서 실행되어야 합니다.


이건 내 버전이야병렬화 없음

1)Main.m과 fm을 My_folder라는 폴더에 저장했습니다.

2)다음과 같이 bash 파일 td.sh를 생성하여 My_folder 폴더에 저장했습니다.

    #$ -S /bin/bash
    #$ -l h_vmem=5G
    #$ -l tmem=5G
    #$ -l h_rt=480:0:0
    #$ -cwd
    #$ -j y


    #$ -N try

    date
    hostname

    export SGE_TASK_ID

    for SGE_TASK_ID in {1..2}
do
    #Output the Task ID
    echo "Task ID is $SGE_TASK_ID"

  /share/.../matlab -nodisplay -nodesktop -nojvm -nosplash -r "main; ID=$SGE_TASK_ID; f; exit"
done

삼)터미널에 가서 ssh username@A, cd /.../My_folder, 다음을 입력합니다.bash td.sh


병렬화를 위해, 이 포럼의 많은 답변에서는 사용을 권장합니다 parallel. 나는 bash 파일이 아래와 같다고 생각한다.

#$ -S /bin/bash
#$ -l h_vmem=5G
#$ -l tmem=5G
#$ -l h_rt=480:0:0
#$ -cwd
#$ -j y


#$ -N try

date
hostname

export SGE_TASK_ID

SGE_TASK_ID={1..2}

echo "$SGE_TASK_ID" | parallel -P 2 /share/.../matlab -nodisplay -nodesktop -nojvm -nosplash -r "main; ID=$SGE_TASK_ID; f; exit"

그러나 이것은 터미널에서 수신되는 오류입니다.

A.local
td.sh: line 16: parallel: command not found

parallel내가 이해한 바로는 기계에 "소프트웨어"가 부족할 수 있습니다 . 설치할 수 있나요? 그렇다면 어떻게 설치하나요? 아니면 시스템 관리자가 설치해야 합니까? 아니면 다른 제안사항이 있으신가요 parallel?


업데이트: 아래 두 번째 답변의 스크립트를 구현하려고 합니다.

#!/bin/bash -l
#$ -S /bin/bash
#$ -l h_vmem=5G
#$ -l tmem=5G
#$ -l h_rt=480:0:0
#$ -cwd
#$ -j y


#$ -N try

date
hostname

export SGE_TASK_ID

SGE_TASK_ID={1..2}

echo -e SGE_TASK_ID | xargs -I {} -P 4 /share/.../matlab -nodisplay -nodesktop -nojvm -nosplash  -r "main; ID={}; f; exit"

이것은 내가 받은 오류 메시지입니다.

Undefined function or variable 'SGE_TASK_ID'.

답변1

루프 내에서 백그라운드에서 Matlab 작업을 시작하고 루프 후에 완료될 때까지 기다립니다.

for SGE_TASK_ID in 1 2; do
    printf 'Task ID is %d\n' "$SGE_TASK_ID"

    /share/.../matlab -nodisplay -nodesktop -nojvm -nosplash \
        -r "main; ID=$SGE_TASK_ID; f; exit" &
done

wait

Matlab 작업은 빠른 속도로 동시에 시작되고 실행됩니다. after wait루프는 모든 백그라운드 작업이 완료되기 전에 스크립트가 종료되지 않도록 합니다.

작업을 병렬로 J실행할 수 있는 작업 의 경우 :N

SGE_TASK_ID=1
n=0
while [ "$SGE_TASK_ID" -le "$J" ]; do
    if [ "$n" -eq "$N" ]; then
        wait  # waits for the N started jobs to finish
        n=0
    fi

    printf 'Task ID is %d\n' "$SGE_TASK_ID"

    /share/.../matlab -nodisplay -nodesktop -nojvm -nosplash \
        -r "main; ID=$SGE_TASK_ID; f; exit" &

    SGE_TASK_ID=$(( SGE_TASK_ID + 1 ))
    n=$(( n + 1 ))
done

wait

또 다른 변형은 기다리는 것입니다하나의백그라운드 작업은 루프의 - 문 내에서 수행되며 if0 으로 설정하는 대신 wait -n단순히 1씩 감소시킵니다 .n

답변2

약간 더 깨끗한 솔루션입니다.

echo -e "1\n2" | xargs -I {} -P $(nproc) /share/.../matlab -nodisplay -nodesktop -nojvm -nosplash  -r "main; ID={}; f; exit"

작업이 2개 이상인 경우

관련 정보