MPI减少用户定义的通信器

时间:2015-01-25 01:05:38

标签: fortran mpi openmpi

目前我正在使用Fortran中的MPI代码。使用mpi_cart_create然后mpi_group_excl创建一个包含其中一半节点的新组后,我尝试使用此通信器执行缩减,但我显然做错了。

使用代码

call MPI_cart_create(MPI_comm_world, 2, dims, (/.false.,.false./), reorder, comm_cart, ierr)
if (ierr/=0) stop 'Error with MPI_cart_create'

call MPI_group_excl(group_world, dims(2), excl_a, division_comm_a, ierr)
if (ierr/=0) stop 'Error with MPI_group_excl - division_comm_a'

call MPI_group_excl(group_world, dims(2), excl_b, division_comm_b, ierr)
if (ierr/=0) stop 'Error with MPI_group_excl - division_comm_b'

if (div_a_rank .gt. 0) then
    call MPI_reduce(division_a(1), division_a(1), L_outer_y, MPI_DOUBLE_PRECISION, MPI_SUM, &
    & 0, division_comm_a, ierr)
    if (ierr/=0) stop 'Error with MPI_reduce on division_comm_a'
end if

我得到的错误是:

*** An error occurred in MPI_Reduce
*** on communicator MPI_COMM_WORLD
*** MPI_ERR_ARG: invalid argument of some other kind
*** MPI_ERRORS_ARE_FATAL: your MPI job will now abort

在回答之后我使用了MPI_comm_create_group,但是我仍在使用

*** An error occurred in MPI_Reduce
*** reported by process [140046521663489,140045998620672]
*** on communicator MPI_COMM_WORLD
*** MPI_ERR_ARG: invalid argument of some other kind
*** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
***    and potentially your MPI job)

1 个答案:

答案 0 :(得分:4)

问题是你正在混合群体和传播者。在MPI中,组只是一个逻辑的进程集合。它无法用于沟通。

如果要从新组创建新的通信器,则应使用函数MPI_COMM_CREATE_GROUP。您可以将新组传递给该功能,以创建一个可用于减少的新通信器。