Message Passing Interface(MPI)

강병우·2023년 11월 13일
0

병렬프로그래밍

목록 보기
20/24

MPI

분산 메모리 환경에서, 각 CPU는 독립적인 환경을 갖고 있기 때문에 MPI를 통해 메세지를 주고 받는다. 서로 다른 interconnect를 가진 CPU들이 같은 소프트웨어를 읽어야 하기 때문에 이를 MPI에서 담당하게 된다.

How to use?

C코드에서 MPI를 사용하기 위해서, mpi.h를 임포트해야 한다. MPI 프로그래밍 소스코드를 컴파일하려면 다음과 같은 명령어를 입력해야 한다

mpicc -g -Wall -o mpi_hello mpi_hello.c
-g : 디버그 정보 생성
-Wall : 모든 Warning을 프린트한다.
-o : 실행파일 컴파일파일 경로를 정의할 수 있다.

이렇게 만들어진 C파일을 실행시킬 수 있다.
mpiexec -n <number of processes> <executable>

Programming

  1. C 기반 프로그래밍
  2. stdio.h, string.h를 사용
  3. mpi.h 임포트 필요
  4. 모든 MPI콜은 MPI_로 시작
  5. 첫번째 글자는 대문자(ex:MPI_Init)

  • MPI_Init(int* argc_p, char*** argv_p)
    MPI 초기화

  • MPI_Finalize(void)
    MPI 리소스 클린업

Communcators

-> 다른 이들에게 메세지를 전송할 수 있는 프로세서의 묶음
MPI_COMM_WORLD라고도 불린다.

int MPI_Comm_size(
	MPI_Comm comm		//in
    int*	 comm_sz_p	// out
)

해당 커뮤니케이터에 참여할 프로세서의 개수를 선언한다.

int MPI_Comm_rank(
	MPI_Comm comm		// in
    int*	 my_rank_p	// out
)

해당 커뮤니케이터에 내 프로세서가 몇번째 순위인지 선언한다.

Send

MPI의 Send를 하는 함수이다. Send 과정은 아래처럼 나타난다.

Receive

메세지를 보냈으니,이제 받을 차례이다.

여기서 주의해야할 점들이 있다. Receiver는 아래 3가지 없이 메세지를 받아온다.

  1. 메세지 데이터의 크기
  2. 누가 보냈는지
  3. 메세지 태그

이를 MPI_Status를 체크하여 확인할 수 있다.

MPI를 몇 개 받았는지 아래함수로 확인할 수 있다.

Issues with send and receive

  1. 블로킹 방식이다. Receive까지 끝나는 것을 확인하고 끝난다.
  2. 메세지에 대한 버퍼링이 필요하다. 버퍼크기에 따라 Send를 블로킹에서 빠져나올 수도 있다.
  3. Receive는 맞는 데이터가 도착할 때까지 블로킹한다.

none over taking : MPI Queue가 2개의 메세지를 보낸다고 할 때, 첫번째 메세지가 avaliable하고, 두번째 메세지가 확인되어야 한다. 즉, 순차적으로 도착해야한다.

0개의 댓글