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개의 프로세스를 이용한다는 의미이다.
'Cloud Computing' 카테고리의 다른 글
8. MPI프로그램 1:1 통신모드 (1:1 Communication Modes) (6) | 2020.10.21 |
---|---|
7. MPI 프로그램 기본예제(Send, Receive) (8) | 2020.10.21 |
5. 병렬 프로그램의 성능 평가 (Performance) (0) | 2020.10.21 |
4. 인터커넥션 네트워크 (Interconnection Networks) (0) | 2020.10.21 |
3. 병렬 하드웨어 (Parallel Hardware) (6) | 2020.10.20 |