Yeon's 개발블로그

지식을 전파하는 개발자가 되고싶습니다.

Cloud Computing

6. MPI program: Coding, Compile, and Run

Dev.yeon 2020. 10. 21. 15:19

1. Coding 

#include <stdio.h>
#include <string.h>
#include <mpi.h>

int main(void){
char greeting[100];
int my_rank,comm_sz,source;

MPI_Init(NULL,NULL);
MPI_Comm_rank(MPI_COMM_WORLD,&my rank);
MPI_Comm_size(MPI_COMM_WORLD,&comm_sz);

if(my_rank!=0){
sprintf(greeting, "Greeting from process %d of %d",my_rank,comm_sz);
MPI_Send(greeting,strlen(greeting)+1,MPI_CHAR,0,5,MPI_COMM_WORLD);
}
else{
printf("Greetings from process %d of %d \n",my_rank,comm_sz);
for(source=1;source<comm_sz;source++){
MPI_Recv(greeting, 100, MPI_CHAR,source,5,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
printf("%s\n",greeting);}
}
MPI_Finalze();
return 0;
}

1) MPI_Init() : 다른 MPI함수들이 호출되기 이전에 먼저 호출되어야하며, 한번만 호출해주면된다. 

2) MPI_Finalize() : MPI가 끝났다는 것을 알려주는 것으로 코드 마지막에 한번만 호출해주면 된다.

3) MPI_Comm_rank(커뮤니케이터이름, 프로세스번호를 받아올 변수) : 커뮤니케이터 안에서 함수를 실행하는 프로세스의 번호를 받아온다. 

4) MPI_Comm_size(커뮤니케이터이름, 프로세스개수를 받아올 변수) : 커뮤니케이터 안에 있는 프로세스의 개수를 받아온다. 

*통신범위 Communicators : 프로세스의 집합으로, 같은 커뮤니케이터 안에있는 프로세스끼리만 통신이 가능하다. 커뮤니케이터 안에 있는 프로세스는 고유 번호를 가지고, 새롭게 커뮤니케이터가 형성되면 고유번호도 바뀐다. 라이브러리가 사용하는 커뮤니케이터와 프로그래머가 사용하는 커뮤니케이터는 다르기 때문에 unsafe메세지를 방지할 수 있다. 

5) MPI_Send(send_buf, send_buf_size, send_type, dest, send_tag, send_comm) : 위의 코드를 예시로 들면, greeting이라는 send buffer에서 greeting길이보다 1만큼 큰 사이즈를 MPI_CHAR라는 data type으로 process0에게 5번태그를 붙여서 보낸다는 것이다. 

6) MPI_Recv(recv_buf, recv_size, recv_type, src, recv_tag, recv_comm, &status) : 위의 코드를 예시로 들면, greeting이라는 recv buffer에서 100사이즈를 MPI_CHAR라는 data type으로 process1에서부터 5번태그에 해당하는 것을 ignore하게 받는다는 것이다. 

 

2. Compile and Run

mpicc test.c -o test // 컴파일
mpiexec -n 16 ./test //실행

MPI는 라이브러리 이며, C언어로 작성된다. 따라서 MPI header file을 반드시 추가해줘야한다. C파일을 실행파일로 컴파일 한 후 , 몇개의 프로세스를 돌릴지 입력하고 실행하면된다. -n 뒤에 붙는 숫자는 몇개의 프로세스를 돌릴지 결정한다. 예시에서는 16개의 프로세스를 이용한다는 의미이다.