제 생각에는병렬화아래 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
또 다른 변형은 기다리는 것입니다하나의백그라운드 작업은 루프의 - 문 내에서 수행되며 if
0 으로 설정하는 대신 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개 이상인 경우