mpi_reduce
을 mpi_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 구현과도 작동합니까?
감사합니다. 나는'MPI_IN_PLACE' 문서를 잘못 해석했다. 집단 통신은 정확히 같은 주장을하는 모든 프로세스에 의해 호출되어야한다고 생각했기 때문이다. – Yossarian
정말 확실합니까? 제 프로덕션 코드를 살펴보고 잘못된 사용 사례가 많아서 지금까지 문제가 발생하지 않았습니다. –
@VladimirF,'MPI_INTO '또는'MPI_ALLREDUCE'와 같은 모든 등급에 의해'MPI_IN_PLACE'가 송신 버퍼로 지정되어야하는 일부 집단 작업이 있습니다. 표준은 각 작업에 대한 적절한 사용을 개별적으로 나열합니다. –