gpt4 book ai didi

fortran - 就地 mpi_reduce 与 OpenMPI 崩溃

转载 作者:行者123 更新时间:2023-12-04 05:18:36 26 4
gpt4 key购买 nike

每当我尝试调用 mpi_reducempi_in_place作为发送缓冲区它崩溃。谷歌的拖网显示这是 OMPI 1.3.3 在 Mac OS 上的问题 - 但我在 CentOS 上使用 OMPI 1.6.3(使用 gfortran 4.4.6)。

以下程序崩溃:

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 中就地缩减操作如何工作的一个非常重要的部分(请参阅粗体文本):

When the communicator is an intracommunicator, you can perform a reduce operation in-place (the output buffer is used as the input buffer). Use the variable MPI_IN_PLACE as the value of the root process sendbuf. In this case, the input data is taken at the root from the receive buffer, where it will be replaced by the output data.



其他进程仍然必须以 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

您可以安全通过 buffer作为非根进程中的 sendbuf 和 recvbuf, MPI_REDUCE不会在这些进程中写入 recvbuf。

关于fortran - 就地 mpi_reduce 与 OpenMPI 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17741574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com