2011-12-21 1 views
1

나는 연습을 위해 여기서하고있는 코드를보고있다.Open MPI의 축소 축소가 동기화됩니까?

http://www.mcs.anl.gov/research/projects/mpi/usingmpi/examples/simplempi/main.html

나는 여기에 표시된 부분에 대한 혼란 스러워요.

MPI::COMM_WORLD.Reduce(&mypi, &pi, 1, MPI::DOUBLE, MPI::SUM, 0); 
if (rank == 0) 
    cout << "pi is approximately " << pi 
     << ", Error is " << fabs(pi - PI25DT) 
     << endl; 

내 질문 MPI를 다른 모든 프로세스 (이 경우 순위 1-3로 프로그램)이 끝나면 알고 그 결과가 완료되었음을 기능을 감소 않습니다입니까?

답변

6

모든 공동 통신 호출 (Reduce, Gather, Scatter 등)이 차단됩니다.

+0

그래서 모든 통신 호출이 완료 될 때까지 차단됩니까? –

+0

모든 [_collective_ communication calls] (http://www.netlib.org/utk/papers/mpi-book/node91.html#SECTION00500000000000000000) do는 지정된 그룹의 다른 모든 프로세스가 다음 프로세스를 완료 할 때까지 모든 프로세스가 차단됨을 의미합니다. 일치하는 전화를 받았습니다. – suszterpatt

+0

@suszterpatt, 그건 사실입니다. – jman

3

@ g.inozemtsev가 정확합니다. Open MPI의 MPI 콜렉션을 포함하여 MPI 콜렉티브 콜은 MPI의 의미에서 "차단"되어 있습니다. 즉, 콜백이 반환 될 때 버퍼를 사용할 수 있습니다. MPI_REDUCE와 같은 연산에서는 반환 할 때 루트 프로세스가 버퍼에 응답을 갖게됨을 의미합니다. 또한 MPI_REDUCE의 루트가 아닌 프로세스가 MPI_REDUCE가 반환 할 때 버퍼를 안전하게 덮어 쓸 수 있다는 것을 의미합니다 (일반적으로 축소의 일부가 완료되었음을 의미).

그러나 위에서 언급했듯이 한 프로세스에서 MPI_REDUCE와 같은 일괄 작업에서 반환하는 작업은 피어 프로세스에서 동일한 일괄 작업을 반환하는 것과 관계가 없습니다. 장벽이 명시 적 동기화로 정의 되었기 때문에이 규칙에 대한 유일한 예외는 MPI_BARRIER 인 반면 다른 모든 MPI-2.2 집단 작업은 반드시 명시 적으로 동기화 할 필요가 없기 때문입니다.

구체적인 예로 모든 루트가 아닌 프로세스는 시간 X에서 MPI_REDUCE를 호출한다고 가정합니다. 루트는 마지막으로 시간 X + N에서 MPI_REDUCE를 호출합니다 (이 예에서는 N이 큰 것으로 가정). 구현에 따라 루트가 아닌 프로세스는 X + N보다 훨씬 빨리 반환하거나 X + N (+ M)까지 차단할 수 있습니다. 이 시점에서 MPI 표준은 의도적으로 모호하여 MPI 구현이 원하는/원하는 것을 수행 할 수 있습니다 (자원 소비/가용성에 따라 결정될 수도 있음).

따라서 @ g.inozemtsev의 "동기화에 의존 할 수 없습니다"라는 요지는 (MPI_BARRIER 제외) 올바른 것입니다.