학생이라면 KISTI에서 6개월 무료 (3000 시간 무료) 계정을 받아서 병렬 컴퓨팅 환경에서 과학 계산을 할 수 있다.


포트란에서 실수 계산의 정확도를 양수, 음수 10의 4000승 이상 까지 보장하므로, 포트란을 통해 정확한 계산을 수행할 수 있다.


이번 포스팅에서는 읽는이가 KISTI에서 계정을 받았다고 가정하고, 수퍼 컴퓨터 접속 방법과 병렬 컴퓨팅(MPI, message passing interface)을 이용하여 Hello World 예제 구현까지 다룬다.



1) 수퍼컴퓨터 계정 신청 개요


수퍼컴퓨터 계정은 KSC 헬프 데스크 웹 사이트 (https://helpdesk.ksc.re.kr/)에서 신청한다.


이 때 I-PIN을 통해 계정을 발급 받아야 하므로, I-PIN이 없다면 신청하고 준비한다.


이후 승인이 완료되면, OTP 신청을 추가로 하여, 휴대폰에 OTP 어플을 설치하고 접속 때 사용한다.



2) 수퍼컴퓨터 접속 방법


계정 신청이 완료되면 이메일로 접속 주소, 아이디, 비밀번호가 발급 된다.


윈도우 사용자는 putty를 써서, 리눅스 사용자는 ssh로 접속하면 된다.


아래 그림에서 putty를 사용한 접속 예시를 나타낸다.



해당 주소에 접속하면 아이디, OTP 번호, 비밀번호를 입력하는 창이 나온다.




3) 컴파일에 필요한 모듈 설정


접속하면 발급받은 아이디에 할당 받은 홈 디렉토리에 접속된다.


여기서 포트란 컴파일을 하고 MPI를 사용하기 위해서 필요한 모듈을 추가해야 한다.


$ module av


명령어를 쓰면 사용 가능한 모듈 리스트를 볼 수 있다.


아래와 같은 결과가 나올 것이다.



모듈 추가 명령어는 module add <module01> <module02> ... 와 같이 한다.


이 예제에서는 아래와 같은 명령어를 써서 gcc 컴파일러와 openmpi를 추가한다.


$ module add compiler/gcc-4.4.6 mpi/openmpi-1.4.3


모듈이 제대로 추가되었나 확인하려면


$ module li


를 한다. 정상적으로 추가되었으면 아래와 같은 화면이 뜬다.



모듈을 삭제하고 싶다면 module del <module name> 을 쓴다.



4) Hello MPI 소스 코드


MPI (Message Passing Interface)는 포트란, C, 파이썬을 써서 병렬 컴퓨팅 환경 자원을 사용할 수 있게 도와주는 라이브러리다.


MPI는 포트란에서 서브루틴으로 구현되어 있다. 따라서 파라미터를 입력하면, 그 파라미터에 해당하는 값이 다시 리턴된다는 점을 주의하며 아래 예제 소스코드를 살펴보자.


 1         program helloworld
 2 
 3         include 'mpif.h'
 4         integer comm, rank, numproc, ierror
 5 
 6         call MPI_INIT(ierror)
 7         call MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierror)
 8         call MPI_COMM_SIZE(MPI_COMM_WORLD,numproc,ierror)
 9 
10         print *,"Hello World from Processor ",rank," of ",numproc
11 
12         if(rank.eq.0) then
13             print *,">>> This is the ",rank," processor."
14         endif
15 
16         call MPI_FINALIZE(ierror)
17 
18         end program helloworld


3번 줄: 포트란용 mpi 헤더 파일을 추가한다.


6번 줄: MPI_INIT을 통해 MPI를 초기화 한다.


7번 줄: MPI_COMM_RANK 에서 현재 코드가 돌아가는 프로세서의 번호를 rank 변수에 받아온다. (MPI_COMM_WORLD는 커뮤니케이터를 할당한다. 한 프로그램을 돌리는 여러 개의 프로세서가 한 커뮤니티에 속해 있다.)


8번 줄: 프로그램에서 사용하는 총 프로세서의 개수를 numproc에 받아온다.


10번 줄: 현재 프로그램을 구동하는 프로세서 번호와 총 프로세서 개수를 화면에 표시한다.


12-14번 줄: 만약 현재 프로세서가 0번이면 화면에 추가적인 메시지를 출력한다.


16번 줄: MPI 를 종료한다.



5) MPI 프로그램 컴파일과 실행


MPI를 쓴 프로그램을 컴파일 할 때는 mpif90 -o <실행파일> <소스파일> 과 같은 형태를 쓴다.


위 예제 소스코드는 아래 명령어를 써서 컴파일 하도록 하자.


$ mpif90 -o hellompi hellompi.f90


KISTI 수퍼컴퓨터에서는 MPI를 실행하기 위해서 스크립트에 옵션을 설정하고, 실행하고자 하는 프로그램을 job으로 큐(queue)에 제출해야 한다.


스크립트 파일 예제는 서버의 홈 디렉토리 하위 디렉토리에 job_examples에 있다.


이 예제에서는 mpi를 사용하므로 mpi.sh 파일을 살펴보자.


파일을 아래와 같이 변경하고 살펴보자.


#!/bin/bash

#$ -V

#$ -cwd

#$ -N mvapich2_job

#$ -pe mpi_fu 16

#$ -q normal

#$ -R yes

##$ -wd /scratch2/<user01>/mvapich

#$ -l h_rt=01:00:00


mpirun -machinefile $TMPDIR/machines -np $NSLOTS ./hellompi


5번 줄의 -pe mpi_fu 16에서 16은 프로그램에서 사용하고자하는 프로세서의 개수를 말한다.


마지막 줄은 그대로 사용하고, 제일 마지막에만 실행하고자 하는 실행파일 이름을 써준다.


설정이 완료되면, 해당 파일을 아래 명령어를 써서 큐에 제출한다.


$ qsub mpi.sh


큐의 상태를 살펴볼 때는 


$ qstat


을 쓴다.


큐에 자신이 제출한 job을 전부 삭제할 때는 아래 명령어를 쓴다.


$ qdel -u <username>


프로그램이 완료되면 출력 파일이 생성되어 있다.


이 예제에서는 mvapich2_job.o4xxx 형태로 되어 있다.


출력 파일 수행 결과는 아래 그림과 같다.




6) 더 나아가서


MPI 를 이용하여 병렬 컴퓨팅 프로그램을 작성할 때 communication에 관해 필수적으로 이해해야 자원을 효율적으로 사용할 수 있다.


MPI에는 크게 point-to-point communications과 collective communications가 있다.


앞의 것은 한 프로세서에서 다른 프로세서로 데이터 전달, 뒤의 것은 한 프로세서 다른 프로세서로 데이터를 균등 분배, 복사 분배, 또는 여러 프로세서로부터 한 프로세서로 데이터 리덕션, 단순 모으기 등이다.


이에 관한 추가 문서는 구글에서 MPI communications 또는 mpi point-to-point communications, collective communications 등으로 찾아서 학습할 수 있다.

Posted by 공돌이pooh
,