MPI_Reduce와 MPI_Bcast...

MPI를 쓰다보면 MPI_Reduce를 빈번하게 쓰게 된다. 아마도 병렬화하는 능력이 그리 뛰어나지 못해서 개개의 process에서 전체 job의 1/N을 떼어와 수행하고 그 결과를 root process에게 반환하는 방법을 쓰기 때문이기도 하겠다.

그런데, 대개 어떤 결과가 나왔다고 할 때, 그 결과가 만족스러운 상황이면 수행을 중단하고, 그렇지 않으면 계속하겠다와 같은 조건문에 의하여 프로그램이 동작한다고 할 때, 대개 MPI_Reduce로 얻어진 결과를 이용해서 판단하고 그에 맞춰서 컨트롤하게 되는데, 별도의 장치가 없다면 이는 root process만 그렇게 동작하게 되고 나머지 process들은 그와 상관없이 중단 혹은 계속해서 돌게 되므로, 결과적으로 수행시간이 가장 오래까지 도는 process에 맞춰져 (조건에 따라) 엄청나게 늘어나게 된다.

이 때, 모든 process들에게 명령을 내려주는 함수가 MPI_Bcast이다. 이것은 MPI_Reduce의 반대 개념이라고 생각하면 편하다. 이를테면 개개의 process의 결과를 root process에게 알려주기 위해 MPI_Reduce를 썼다면, 반대로 root process가 모든 process에게 신호를 주기 위해서는 MPI_Bcast를 쓴다.

언뜻 읽으면 너무나도 당연한 것을 왜 적어놓았냐고 하겠지만, Bcast는 단순히 broadcast하는 것이 아니라 Bcast하는 process가 아닌 process는 Bcast된 결과를 receive하는 의미를 포함하게 되기 때문이다. 다시 말해서, 의미는 Bcast이지만 root process에는 send가 되고 나머지 process는 receive가 되는 것이다. 마치 MPI_Reduce가 root process에게는 receive가 되고 나머지 process들은 send의 개념이 되는 것과 마찬가지이다.