Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

개발일기

MPI#1 설치 과정 본문

python/mpi

MPI#1 설치 과정

kimjw7815 2025. 4. 14. 15:20

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배가량 차이가 나는 걸 확인할 수 있다.