메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

Message Passing Interface (MPI) 소개

한빛미디어

|

2008-08-26

|

by HANBIT

22,817

제공 : 한빛 네트워크
저자 : 김대곤

MPI는 ‘메시지 전달 인터페이스’로 번역되나 봅니다. 한글로 글을 쓰려고 하면 제일 먼저 찾아보게되는 것이 번역어 입니다. 컴퓨터 관련 용어나 개념들은 주로 미국에 와서부터 공부하기 시작해서 그런지 한글로 어떻게 번역되는지 잘 모르는 경우가 많습니다.

MPI는 병렬 프로그래밍을 하기 위해 사용하는 함수들의 집합 정도라고 할 수 있습니다. 그래서 완전히 새로운 병렬처리를 위한 프로그래밍 언어라고 하긴 힘듭니다. C, C++ 또는 Fortran 언어에서 사용할 수 있습니다. 자바에서도 가능하다는 얘기를 들어본 적이 있지만 실제로 사용해 본 적은 없습니다. 아주 광범위 하게 사용되고 있는 프로그래밍 기법 중의 하나로써 사실상 업계 표준이라고 말들 하지요. 이름에서도 유추해 볼 수 있듯이 메시지가 서로 다른 프로세서들이 통신하는 유일한 방법입니다. 다른 방법은 무엇이 있냐구요. 대표적인 방법으로는 공용 메모리 공간이 있습니다. Thread (쓰레드) 프로그래밍을 해 보신 분들은 아마 잘 알고 계시리라 생각됩니다. 여러 프로세서들이 같은 메모리를 쓰거나 읽을 수 있는 것입니다.

그럼 간단한 Hello World 예제 프로그램을 통해 MPI 프로그래밍이 어떻게 작동하는지 살펴보도록 하겠습니다.
#include 
#include "mpi.h"

int main(int argc, char **argv) {
   MPI_Init(&argc, &argv);
   printf("Welcome to MPI world!n");
   MPI_Finalize();
   return 0;
}
일반 C 프로그램과 다른 점만 설명하도록 하겠습니다. MPI 함수들이 정의되어 있는 헤더 파일(mpi.h)을 알려주어야 합니다. 그리고 MPI 환경을 사용하기 위해 MPI_Init를 호출하고, 종료하기 위해 MPI_Finalize 함수를 호출합니다.

이제 이 예제 프로그램(hello.c)을 컴파일하고 실행해 보도록 하겠습니다.
> mpicc –o hello hello.c
mpicc 는 MPI 컴파일러의 이름입니다. 보통 MPI 컴파일러는 독립적인 컴파일러라기 보다는 다른 컴파일러을 이용하여 최종 파일을 생성합니다. 제가 쓰는 컴퓨터에서는 gcc가 사용되고 있습니다.

이제 실행해서 결과값을 보도록 합시다.
> mpirun –np 2 hello 
Welcome to MPI world!
Welcome to MPI world!
mpirun 은 MPI 환경을 실행하는 명령어입니다. “-np” 옵션은 사용할 프로세서의 숫자를 알려주는 것입니다. 그래서 같은 메시지가 두 번 출력된 것입니다. 즉, 두 개의 프로세서가 한 번씩 출력한 것입니다. 즉, 하나의 MPI 프로그램이 여러 프로세서들에 의해 실행됩니다. 그래서 MPI는 SPMD (Single Program Multiple Data) 모델이라고 말합니다.

이 간단해 보이는 예제에서도 가끔 질문들이 나옵니다. 예를 들면, 만약 MPI_Init과 MPI_Finalize를 호출하지 않으면 어떻게 되느냐? 또는 사용하지도 않는 argc와 argv를 전달해줄 필요가 있는냐? 첫 번째 질문에는 직접 해보시라 말씀드리고 싶습니다. 그리고 항상 두 함수를 호출하는 습관을 들이라고 덧붙이고 싶습니다. 두 번째 질문에 대한 대답은 ‘전달해줘야 한다’입니다. 왜냐하면 MPI_Init 함수는 그렇게 선언되어 있기 때문에 컴파일시에 에러가 발생합니다. 그리고 이 함수를 호출한 후에는 단지 첫 번째 프로세서만 아니라 모든 프로세서가 argc와 argv를 읽을 수 있습니다.

다음으로는 각 프로세서들이 자기자신이 누구인지 그리고 몇 개의 프로세서가 있는지 아는 방법을 예제를 통해 살펴보도록 하겠습니다.
#include 
#include "mpi.h"

int main(int argc, char **argv) {

   int rank, p;

   MPI_Init(&argc, &argv);

   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
   MPI_Comm_size(MPI_COMM_WORLD, &p);

   printf("Welcome to MPI world! %d out of %d processors.n", rank, p);

   MPI_Finalize();
   return 0;
}
첫 번째 프로그램과 달라진 점은 두 개의 정수형 변수 rank와 p가 선언되었다는 것과 MPI_Comm_rank와 MPI_Comm_size 함수가 호출되었다는 것, 그리고 출력문이 조금 복잡해졌다는 정도 입니다. 변수의 선언은 일반 C 프로그램에서 가지는 의미와 같습니다. 주의해야 할 점은 각 프로세서가 이름이 같은 다른 변수를 가지고 있다는 것입니다. 즉, 하나의 변수를 공유하고 있는 것이 아닙니다. 두 함수는 각각의 변수에 값을 부여하기 위해 호출되었습니다. MPI_Comm_rank는 전체 프로세서 중에서 자신이 몇 번째 프로세서인지를 알려줍니다. 첫 번째 프로세서는 0이라는 값을 가지게 됩니다. 그리고 MPI_Comm_size는 전체 프로세서의 숫자를 알려줍니다. MPI_COMM_WORLD는 이미 선언된 환경변수 정도로 생각하시면 됩니다.

이제 프로그램(hello_rank.c)을 컴파일하고 실행해 봅시다.
> mpicc hello_rank.c -o hello_rank
> mpirun -np 3 hello_rank
Welcome to MPI world! 0 out of 3 processors.
Welcome to MPI world! 1 out of 3 processors.
Welcome to MPI world! 2 out of 3 processors.
예상했던 결과가 나왔습니까? 여기선 순서대로 출력이 되었지만 일반적으로는 순서가 정해져 있지 않습니다. 즉, 프로세서 사이에는 시계 같은 존재가 없습니다. 그냥 자기 할 일만 하고 자기는 끝납니다. 두 번째 프로세서는 첫 번째 프로세서보다는 빨리 진행하지 않는다던가 하는 일은 없습니다. 그러한 일들은 MPI의 메시지 전달 함수를 사용할 때 가능해지는 일입니다. 처음에 말씀드린 대로 오직 메시지 전달을 통해서 이루어집니다.

다음 기사에서는 MPI의 메시지 전달 함수들에 대해서 살펴보도록 하겠습니다.
TAG :
댓글 입력
자료실

최근 본 상품0