2013-07-19 4 views
7

mpi_reducempi_in_place으로 호출하려고 할 때마다 송신 버퍼가 충돌합니다. Google의 트롤은 OMPI 1.3.3 용 Mac OS에서이 문제가 있음을 보여 주지만 OMPI 1.6.3 (gfortran 4.4.6 포함)이 포함 된 CentOS에 있습니다.mpi_reduce가 OpenMPI에서 충돌 함

다음 프로그램 충돌 :

PROGRAM reduce 

    USE mpi 

    IMPLICIT NONE 

    REAL, DIMENSION(2, 3) :: buffer, gbuffer 

    INTEGER :: ierr, me_world 
    INTEGER :: buf_shape(2), counts 

    CALL mpi_init(ierr) 
    CALL mpi_comm_rank(mpi_comm_world, me_world, ierr) 

    buffer = 1. 
    IF (me_world .EQ. 0) PRINT*, "buffer: ", buffer 

    buf_shape = SHAPE(buffer) 
    counts = buf_shape(1)*buf_shape(2) 

    CALL mpi_reduce(MPI_IN_PLACE, buffer, counts, mpi_real, mpi_sum, 0, mpi_comm_world, ierr) 
    IF (me_world .EQ. 0) PRINT*, "buffer: ", buffer 

    CALL mpi_finalize(ierr) 

END PROGRAM reduce 

는 MPI 오류는 다음과 같습니다

MPI_ERR_ARG: invalid argument of some other kind 

매우 도움이되지 않습니다.

mpi_reduce은 어떻게 호출해야합니까? 이 기능은 다른 컴파일러/MPI 구현과도 작동합니까?

답변

14

당신은 현재 위치에서 감소 작업이 MPI에서 작동하는 방법의 매우 중요한 부분 (굵게 표시된 텍스트를 참조) 누락하는 것은 :

커뮤니케이터가 intracommunicator이

, 당신은이 작업 인 -을 줄일 수행 할 수 있습니다 place (출력 버퍼가 입력 버퍼로 사용됨). 루트 프로세스sendbuf의 값으로 변수 MPI_IN_PLACE을 사용하십시오. 이 경우, 입력 데이터는 수신 버퍼로부터 루트에서 취해지며, 여기서 출력 데이터로 대체 될 것이다.

IF (me_world == 0) THEN 
    CALL mpi_reduce(MPI_IN_PLACE, buffer, counts, MPI_REAL, MPI_SUM, 0, MPI_COMM_WORLD, ierr) 
ELSE 
    CALL mpi_reduce(buffer, buffer, counts, MPI_REAL, MPI_SUM, 0, MPI_COMM_WORLD, ierr) 
END IF 

당신은 안전하게 루트가 아닌 과정에 모두 sendbuf는 및 recvbufbuffer을 전달할 수 있습니다

다른 프로세스는 여전히 sendbuf는 하지 MPI_IN_PLACE으로 로컬 버퍼를 제공해야 MPI_REDUCErecvbuf에 쓰지 않기 때문에

+0

감사합니다. 나는'MPI_IN_PLACE' 문서를 잘못 해석했다. 집단 통신은 정확히 같은 주장을하는 모든 프로세스에 의해 호출되어야한다고 생각했기 때문이다. – Yossarian

+0

정말 확실합니까? 제 프로덕션 코드를 살펴보고 잘못된 사용 사례가 많아서 지금까지 문제가 발생하지 않았습니다. –

+0

@VladimirF,'MPI_INTO '또는'MPI_ALLREDUCE'와 같은 모든 등급에 의해'MPI_IN_PLACE'가 송신 버퍼로 지정되어야하는 일부 집단 작업이 있습니다. 표준은 각 작업에 대한 적절한 사용을 개별적으로 나열합니다. –