이번엔 MPI를 이용하여 적분을 계산해볼 것이다.
적분식은 다음과 같다.
이 적분식을 Serial Code로 작성하면 아래처럼 나온다.
이 적분코드를 병렬화시켜보려고 한다. 고려할 점들을 정리하자면
1. 문제해결에 대한 작업들을 나눈다.
2. 작업들 간 필요한 통신채널을 정의한다.
3. 작업들을 종합적인 작업으로 통합시켜야 한다.
4. 각 코어에 종합된 작업을들 매핑시켜야 한다.
적분 영역을 작업으로 나누고 각자 계산을 한다. 이걸 영역별로 추가하여 계산하면 된다.
의사코드는 이렇게 나올 수 있다. my_rank에 따라 각 프로세서가 계산할 적분 영역을 나눈다. 이걸 전역변수에 합친다음, 마스터 프로세서(my rank = 0)이 결과를 출력한다.
0번 프로세서가 모든 결과를 한 곳으로 모아 합친다. Trap함수는 적분식이다.
여기서 문제는, I/O를 어떻게 핸들링할 것인지이다.
MPI 프로세서들은 공유된 output device인 stdout을 점유하려고 하기 때문에, 출력된 결과가 일정하지 않을 수도 있다.
이런 식으로, 프로세서의 랭크 순서대로 출력하는 것은 아니다. 그래서 대부분은 0번 프로세서만 출력하게끔 한다.
유저의 인풋값을 읽는 함수이다. 누군가는 유저 인풋을 읽어야 하기 때문에, 0번 프로세서가 읽어오고 각 MPI프로세서에게 메세지를 전달하여 인풋을 전달한다.