Introduction
MPI는 프로세서 사이의 통신을 통하여 병렬로 작업을 처리하는 방식이다. 프로세서 사이의 통신을 위해서는 communicator가 필요하며 default로 MPI_COMM_WORLD
가 있다.
MPI의 통신방식에는 [ 점 대 점 p2p] 와 [ 점 대 다수 p2m] 의 두 가지 방식이 있다.
-
p2p 방식에서는 기본적으로 2가지만 알면 된다.
MPI_SEND
MPI_RECV
-
p2m 방식에서는 여러가지가 있지만, 대표적으로 사용 빈도수가 높은 6가지가 있다.
MPI_ISEND
MPI_IRECV
MPI_BCAST
MPI_GATHER
MPI_SCATTER
MPI_REDUCE
MPI를 구현하기 위해서는 코드내에 헤더파일을 반드시 포함한다.
- 헤더
- Fortran90 & MPI 3.0 이상 :
use mpi_f08
- Fortran90 & MPI 3.0 이하 :
use mpi
- Fortran77 & Any MPI :
include 'mpif.h'
- Fortran90 & MPI 3.0 이상 :
코드는 대부분 다음과 같은 기본 틀 위에 짜여진다. - Fortran90 & MPI 3.0 이상
program mpi_default_frame
use mpi_f08
implicit none
integer :: nproc, rank
call mpi_init
call mpi_comm_size(mpi_comm_world, nproc)
call mpi_comm_rank(mpi_comm_world, rank)
! code here
call mpi_finalize
end program mpi_default_frame
- Fortran90 & MPI 3.0 이하 or Fortran77 & Any MPI
program mpi_default_frame
use mpi ! MPI 3.0 이하
include 'mpif.h' ! Fortran77
implicit none
integer :: ierr, nproc, rank
call mpi_init(ierr)
call mpi_comm_size(mpi_comm_world, nproc, ierr)
call mpi_comm_rank(mpi_comm_world, rank, ierr)
! code here
call mpi_finalize(ierr)
end program mpi_default_frame
ierr
: 코드가 잘 작동했는지 확인하는 return 값. (MPI 3.0에서는ierr
가 option이 되어 적지 않아도 된다.)nproc
: 몇 개의 process가 참여했는지 return 해 주는 값.nrank
: process의 ID에 해당한다. 예를 들어 n개의 process가 작업에 참여한다면, communitor에 의해 각각의 process는 0부터 n-1까지 ID를 가진다.call mpi_init(ierr)
: 초기화 해주는 명령어이다.call mpi_comm_size(mpi_comm_world, nproc, ierr)
:mpi_comm_world
communicator 내에서 참여하는 process의 수를 return한다.call mpi_comm_rank(mpi_comm_world, rank, ierr)
:mpi_comm_world
communicator 내에서 process rank를 return한다.call mpi_finalize(ierr)
: MPI의 종료를 나타낸다.
MPI를 통해 병렬처리를 잘 사용하기 위해서는 loop 부분을 여러 개로 나누어서 계산하도록 하면되고, 적절한 기능을 사용해여 data를 잘 취합하면 된다. OpenMP는 알아서 작업을 나누어 처리하지만, MPI에서는 하나하나 작업을 지시해 주어야 하기 때문에 익혀서 코드를 짜는데 시간이 걸린다. 하지만 cluster를 이용하여 대형 계산을 하기 위해서는 꼭 필요하다. MPI는 프로세서 별로 메모리를 잡아서 사용하여 메모리 낭비가 있지만, OpenMP의 공유 메모리 시스템보다 I/O에서 더 빠르다.
Install
$ sudo pacman -S openmpi
Compile
$ mpif90 -o a.out file_name.f90
몇 개의 process로 할 것인가는 -np
옵션을 사용한다.
$ mpirun -np 4 ./a.out