카테고리 없음

슈퍼컴퓨터 #4

_empty_ 2019. 8. 14. 10:48

과학기술 4차인재양성과정

데이터분석가과정

한국과학기술정보연구원 - 연구원님

 

MPI

:: 학습목표

병렬 프로그램의 개념을 이해한다.

MPI 라이브러리를 이용하여 MPI 프로그램을 컴파일하고 실행시킬 줄 안다.

MPI 라이브러리를 이용하여 MPI 코드를 작성할 수 있다.

 

병렬화는 또 다른 최적화 기법 중 하나

목표는 실행 시간을 감소시키는 것임

- 여러 개의 프로세서, 혹은 코어들을 사용함.

> 1개의 코어로 진행하던 일을 4개의 코어로 parallelaization하면, 실행시간은 단일 코어를 사용할 때보다 1/4로 감소한다.

( 실제로 이정도는 아니지만, 우선 산술적으로는)

 

>ILP (Instruction Level) : cpu레벨에서 진행되므로 automatic. No user control

>Vectorization : automatic. compiler option

>OpenMP : 한 보드 내에 cpu core가 여러개가 있다면 , 그 여러개의 코어를 사용하고 싶을 때. Compiler Directives

>MPI :  Special Libraries. 68개의 코어를 가진 각 노드들을 여러개 묶어 한 시스템처럼 사용.

 

OpenMP가 기본적으로 MPI보다 장점이 많으나

"Use for Distributed Memory"

이 하나의 장점 때문에 MPI를 사용해야 하는 경우가 발생한다.

 

MPI는 library이지, language가 아니다

MPI는 단지 통신 루트를 제공함으로써 데이터를 주고받게 해줄 뿐 프로그래머가 모든 것을 다 프로그래밍 해주어야 한다.

(just a library for inter-process communication and data exchange)

 

 

 

MPI 사용을 위한 모듈 설치

 

mpi의 노드할당을 위한 qsub

select=2 : 몇 개의 노드를 쓸 것인가. openmp는 하나의 노드만 쓰는거니 1만 썼었지만 이번에는 2

mpiprocs를 사용해주는데, 보통 ncpus와 mpiprocs 갯수를 맞춰준다. openmp에서는 보통 ncpus와 threads수를 맞췄는데.

 

vi편집기가 계산시 창이 깨지는? 일이 있다고 오늘은 새로운 터미널을 열어서

거기에서 vi 편집기로 파일을 작성하라고 하셨다. 당연히 동일한 경로에서 작업은 진행하지만.

mpi는 #include "mpi.h" 를 사용한다.

mpi hello.c
hello.c 실행결과들

우리가 처음 qsub로 제출한 옵션에 따르면 우리가 쓸 수 있는 np 수는 8 인데 16을 할당받아 계산해달라 했으니 에러가 난 것.

할당받은 두 개의 노드 확인

hello를 프린트하는 건 아주 쉽고 빨리 진행되는 작업임에도

MPI Program의 경우

시스템(MPI hosfile)을 먼저 확인 한 뒤에 작업을 실행하기 때문에 딜레이가 생긴다.

이 역시도 성능이라, 슈퍼컴퓨터를 도입할 때 이 시스템을 체크하는 시간이 얼마나 걸리는지,

일정 시간을 걸리면 안된다는 기준을 세우거나한다.

 

 

>MPI_COMM_WORLD

- MPI_Init를 호출할 때 자동으로 정의됨

- 사용하는 모든 프로세스를 의미함

이 프로세스들의 묶음 내에서만 통신을 하게 된다.

Rank : Process ID에 해당함

MPI_Comm_rank() : 랭크를 부여하는 것

MPI_Comm_size() : 커뮤니케이터의 크기. 즉 커뮤니케이터 내 프로세스 갯수를 리턴

 

 

Send

Message = Data + Envelope

From : source rank

To : destination rank

tag : 예를 들어 rank0에서 rank4로 데이터를 보낼 때 여러 번 데이터를 보낼 경우

그 데이터들에 숫자?이름을 부여하는 것.

 

-Data : Buffer, Count, Data type

-Envelope : Process identifier (source/destination rank), Message tag, communicator

 

> MPI_Send() vs MPI_Recv()

MPI

 

send_recv 실행결과와 코드

 

Waiting or Testing

-Waiting

: Process blocking until the communication is complete

Non-blocking communication 

 

-Testing

 

 보통 테스트보다 웨이트를 더 많이 쓴다.

waitall.c

 

 

Bidirectional Communication

 

권장 코드

 

if (myrank == 0)

 MPI_Isend(sendbuf, ..., ireq1) ;

MPI_Irecv(recvbuf, ..., ireq2) ;

} else if

 

그래야 위에서 송수신하면서

밑에 다른 작업을 시킬 수 있다?

 

 

MPI_Wtime

- Wall clock time을 반환

MPI_WTIME()

- C

double MPI_Wtime(void)

 

 

How to Parallelize Your Program : Loop

 

>> Block Distribution

n(iteration)을 p(# of processes)로 나눌 때

- 몫 : q, 나머지 : r

- n = p x q + r

프로세스 0, ... , r-1은 (q+1)번의 반복을 할당 받고, 다른 프로세스들은 q번의 반복을 할당 받음

- n = r(q+1) + (p-r)q

 

랭크별로 iteration칸 수를 나누어 할당을 직접 해주어야한다는 소리인데

iteration이 12고 rank가 4라면 rank별로 3칸씩 할당이 될 텐데,

만약 칸이 14라면 앞쪽 랭크부터 한 칸씩을 더 받는다. 즉 남는 두 칸이 각각 rank 0, 1에 한칸씩 추가 할당되어

rank0~3은 4칸, 4칸, 3칸, 3칸을 갖게 되고 이 부분이 자동으로 되는게 아니라 직접 할당을 해주어야한다.

 r----------rank 0---------ㄱ     r---------rank1-----------ㄱ       r---------rank2 ----------ㄱ   r---------rank3-----------ㄱ

0 1 2 3 4 5 6 7 8 9 10 11

 

>> Cyclic Distribution

iteration 하나당 차례대로 rank를 부여하는데, 이 rank가 반복되며 부여되는 형식

iteration  0  1  2  3  4  5  6  7  8  9  10  11   12  13

rank         0  1  2  3  0  1  2  3  0  1   2    3   0   1

 

>> Block-Cyclic Distribution

Block과 Cyclic의 장점을 모두 합친 방식으로 성능의 향상은 분명 있으나

잘 쓰려고 하지는 않는 방식이라고 한다.

 

Nested Loop

Fortran과 C의 Loop 방식이 다르다.

C는 리니어 메모리에 (메모리는,배열은 1차원이니까) 첫번째 row를 다 매핑하고 그다음 row를 메모리에 매핑하는 방향인데

Fortran은 Column 순서대로 첫 Column을 메모리에 mapping하고 그다음을 또 매핑하는방식으로 진행한다.

대부분의 언어는 C처럼 매핑을 진행할 것이다. 

 

para_range : KISTI일하는 분들은 다 쓰기때문에 알고 계신다고 한당.

 

 

Collective Communications

 

Barrier동기화

- 모든 프로세스가 호출할 때까지  caller를 블로킹 함

프로세스 동기화를 위해 배리어를 사용한다.

성능적 측면에서는 안좋게 되겠지만, 병렬 프로그래밍에서는 성능이 중요하니 가끔 사용된다.

Broadcast

- 랭크 root는 자신을 포함한 모든 프로세스에 메시지를 전송

 

bcast
bcast 실행창

 

버퍼 지정해주고 타입과 루트만 지정해주면 되기 때문에 사용이 쉽다.

 

MPI_Gather

- Root프로세스도 포함하여 각 프로세스는 동일 크기의 송신 버퍼의 내용을 root프로세스로 전송

- Root 프로세스는 메시지를 받아서 각 랭크의 순서로 저장

- 'in place'옵션은 root에서 send buf의 값으로 MPI_IN_PLACE'로 지정. 이 경우 sendcount, sendtype은 무시됨

MPI_gatherv

 

scatterv <-> gatherv

 

 

 

 

 

 

 

https://www.mpi-forum.org/docs/

 

MPI Documents

The official version of the MPI documents are the English Postscript versions (for MPI 1.0 and 1.1) and PDF (for the other versions). In several cases, a translation or HTML version is also available for convenience. The HTML version was made with automate

www.mpi-forum.org