2015년 6월 10일 수요일

Extract even or odd line of text files 텍스트 파일에서 홀수나 짝수 줄만 뽑아내기

먼저 ouput file에서 특정 이름을 찾아서 line number, column3 column4 를 출력하는 예

grep 'EHn3lo(Q^4)' out_file | awk '{print NR" "$3"  "$4}'


출력 결과에서 짝수번째 결과만 뽑고 싶은 경우 

awk 'NR%2==0 {print $1}' infile


예를 들어 out_He6_idx02 라는 file에서 binding energy (MeV) 가 나오는
줄을 모두 찾은 뒤 그 중 짝수번재 라인에서 4번재와 5번째 Column 의
내용만 보고 싶을 때,

grep 'binding energy (MeV)' out_He6_idx02 | awk 'NR%2==0 {print NR" "$4"  "$5}'

2015년 6월 8일 월요일

Sun Grid Engine (SGE) 에서 여러개의 job을 하나로 submit 하기

예를 들어 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.