개발일기
MPI#1 설치 과정 본문
mpi는 다른 라이브러리들과 다르게 실행하기 위해선 윈도우 기준으로 MS MPI가 따로 필요하다고 한다.
https://learn.microsoft.com/en-us/message-passing-interface/microsoft-mpi
Microsoft MPI - Message Passing Interface
Explore Microsoft MPI, a high-performance parallel application development tool for Windows. Learn about its benefits, download options, and access tutorials.
learn.microsoft.com
필요한 파일은
- msmpisetup.exe (라이브러리)
- msmpisdk.msi (SDK)
이 2개. 설치하는 데에는 1분도 넘게 걸리지 않는다.
MPI가 무엇이냐 하면 massage passing interface인데, 하는 일은 병렬 연산을 하게 해준다는 거다.
흔히 아는 속담 중에 백지장도 맞들면 낫다고 하는데, 그 말은 컴퓨터에게도 똑같이 적용되는지라, 똑같은 일을 더 많은 수의 프로세서로 처리하면 그만큼 더 빨리 처리할 수 있다.
각설하고, 바로 예제 겸 코드를 보자면, mpi4py에서는 MPI.COMM_WORLD로 우선 mpi를 쓰겠다고 선언하고, Get_size랑 Get_rank로 대부분의 처리를 할 수 있다. comm.reduce가 있는데, 이건 말하자면 프로세서마다 따로따로 가지고 있는 걸 한 프로세서로 모아주는 함수이다. 이건 생략하고 다음에 알아보도록 하자.
from mpi4py import MPI
import time
import math
comm=MPI.COMM_WORLD
size=comm.Get_size()
rank=comm.Get_rank()
radius=1
num=10000000
dx = (2 * radius) / num
def y(x):
return math.sqrt(radius**2-x**2)
if rank==0:
start_time=time.time()
sum = 0
x = -radius
for _ in range(num):
sum += y(x) * dx
x += dx
area=sum*2
error=math.pi*radius**2-area
print(f"mpi X : 넓이 {area} 오차 {error:.20f}")
end_time=time.time()
print(f"걸린 시간 {end_time-start_time}초")
sum=0
local_n = num // size
x = -radius+2*radius*rank/size
if rank==0:
start_time=time.time()
for _ in range(local_n):
sum += y(x) * dx
x += dx
total_sum = comm.reduce(sum, op=MPI.SUM, root=0)
if rank == 0:
area=total_sum*2
error=math.pi*radius**2-area
print(f"mpi O : 넓이 {area} 오차 {error:.20f}")
end_time=time.time()
print(f"걸린 시간 {end_time-start_time}초")
PS E:\30303kjw> mpiexec -n 4 python test2.py
mpi X : 넓이 3.1415926534025997 오차 0.00000000018719337191
걸린 시간 3.954446315765381초
mpi O : 넓이 3.1415926534733645 오차 0.00000000011642864450
걸린 시간 1.002370834350586초
똑같은 결과를 내는 데에 시간이 4배가량 차이가 나는 걸 확인할 수 있다.
