예를 들어 32 개의 process를 사용하는 mpi 프로그램이 100개 있을 경우,
한번에 job을 submit 하는 방법을 생각해 보자.
(1) 무식하게 100번 submit하기 : qsub 를 100번 하기
(2) array job 이용하기(-t 옵션) : 100 개의 sub job을 하나의 jobid 로 submit하기.
편하고 Job id는 하나이지만,
실제로는 TASK_ID가 1-100까지 붙는 100개의 job을 submit 하는 셈이다.
만약 한번에 실행 가능한 job의 갯수에 제한이 있는 경우, 순차적으로 실행되게 된다.
#$ -pe mpi_fu 32
#$ -t 1-100
mpirun -np $NSLOTS ./program${SGE_TASK_ID}
(3) machine file splitting : SGE가 확보한 자원을 직접 100 개의 program에 나누어 할당한다. 먼저 다음과 같이 job script를 준비한다.
#$ -pe mpi_fu 3200 <---32*100
cat $PE_HOSTFILE | awk '{print $1 " slots=" $2}' > "myhost_ompi"
./my_wrapper_script
여기서 $PE_HOSTFILE은 SGE가 확보한 자원의 machine file 이다.
(형식은 "node0904 8 normal@node0904 UNDEFINED" 꼴.)
이것을 openmpi 용 machine file로 바꾼다.
(형식은 "node0904 slots=8" 꼴.)
mvapich의 경우에는 다음과 같이 바꾸어 주면 된다.
for host in `cat $PE_HOSTFILE | awk '{print $1}'`; do
num=`grep $host $PE_HOSTFILE | awk '{print $2}'`
for i in `seq 1 $num`; do
echo $host >> "myhost_mpich"
done
done
wrapper script에서는 machine hostfile 을 필요한 만큼 잘라서 여러개의 hostfile
( host_$num ) 으로 만들고
"mpirun -np 32 -hostfile host_$num ./program_$num > out_$num &" 을 프로그램 수 만큼 실행 시켜주면 된다.
sed -n 1,4p myhost > host_1
and so on... -> extract lines 1-4 "p" is a printout command.