#include일반 C 프로그램과 다른 점만 설명하도록 하겠습니다. MPI 함수들이 정의되어 있는 헤더 파일(mpi.h)을 알려주어야 합니다. 그리고 MPI 환경을 사용하기 위해 MPI_Init를 호출하고, 종료하기 위해 MPI_Finalize 함수를 호출합니다.#include "mpi.h" int main(int argc, char **argv) { MPI_Init(&argc, &argv); printf("Welcome to MPI world!n"); MPI_Finalize(); return 0; }
> mpicc –o hello hello.cmpicc 는 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) 모델이라고 말합니다.
#include첫 번째 프로그램과 달라진 점은 두 개의 정수형 변수 rank와 p가 선언되었다는 것과 MPI_Comm_rank와 MPI_Comm_size 함수가 호출되었다는 것, 그리고 출력문이 조금 복잡해졌다는 정도 입니다. 변수의 선언은 일반 C 프로그램에서 가지는 의미와 같습니다. 주의해야 할 점은 각 프로세서가 이름이 같은 다른 변수를 가지고 있다는 것입니다. 즉, 하나의 변수를 공유하고 있는 것이 아닙니다. 두 함수는 각각의 변수에 값을 부여하기 위해 호출되었습니다. MPI_Comm_rank는 전체 프로세서 중에서 자신이 몇 번째 프로세서인지를 알려줍니다. 첫 번째 프로세서는 0이라는 값을 가지게 됩니다. 그리고 MPI_Comm_size는 전체 프로세서의 숫자를 알려줍니다. MPI_COMM_WORLD는 이미 선언된 환경변수 정도로 생각하시면 됩니다.#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; }
> 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의 메시지 전달 함수를 사용할 때 가능해지는 일입니다. 처음에 말씀드린 대로 오직 메시지 전달을 통해서 이루어집니다.
최신 콘텐츠