Collective Communication

강병우·2023년 11월 22일
0

병렬프로그래밍

목록 보기
22/24

Tree-structured communication

위와 같은 동작을 실행한 트리 구조로 된 통신이 Sum을 하게 된다면, 아래처럼 나온다.

또 하나의 예시로, 하나의 합으로 모으는 과정이 있다.

MPI_Reduce를 사용하면, 위에서 합을 계산한 것처럼, 각 프로세스에서 계산한 결과를 한 곳으로 모아줄 수 있다.

MPI_Reduce은 전체 합을 계산할 뿐만 아니라 최소/최댓값도 구할 수 있다. 자세한 Opertaion은 아래처럼 나와있다.

Collective VS Point-to-Point

커뮤니케이터의 모든 프로세스가 참여할 때, Collective Communication이라고 한다. 이 때, MPI_Reduce를 하나의 프로세스에서 실행하고 있을 때 다른 프로세스가 MPI_Recv를 해버리면 프로그램이 Hang이 걸리거나 크래쉬가 일어날 것이다.

MPI Collective Communication에서 실행 중인 각 프로세스에 들어온 Argument는 반드시 "Compatible"해야 한다. 예를 들어, dest_process를 0을 주고, 다른 프로세스에선 1을 줄 경우, MPI_Reduce를 실행할 때 에러가 발생한다.

output_data_p 파라미터의 경우, dest_process에서만 사용된다. 하지만, 모든 프로세스에서 필요하다. NULL일지라도.

Point to Point Communication은 태그라는 정보로 커뮤니케이터와 매칭한다.

MPI_Reduce를 호출하는 예시이다.

MPI_Allreduce

모든 프로세스의 글로벌 sum이 필요할 때 사용한다.

함수 파라미터는 다음과 같다. 모든 프로세스가 갖고 있는 값의 합을 구한다음, 모든 프로세스에게 합 결과를 보내준다. 일종의 BroadCast라고 보면 된다.

하지만 이렇게 통신하면 하나의 프로세스에서 최대 6번이나 통신하기 때문에, 교차 통신을 통해 이에 대한 리소스를 절약할 수 있다.

나비모양처럼 생겨서 A butterfly-structured global sum이라고 한다.

Broadcast

싱글 프로세스가 갖고 있는 정보를 모든 프로세스에게 전달해준다.

브로드캐스트는 A Tree stuructured Broadcast를 통해 이루어진다.

Get_input using MPI_Bcast

Get_input함수같은 경우가 Bcast를 사용한다. 0번 프로세스가 값을 가져온 다음, Bcast를 통해 모든 프로세스에게 입력받은 값을 전달해준다.

0개의 댓글