目前我正在使用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)
答案 0 :(得分:4)
问题是你正在混合群体和传播者。在MPI中,组只是一个逻辑的进程集合。它无法用于沟通。
如果要从新组创建新的通信器,则应使用函数MPI_COMM_CREATE_GROUP
。您可以将新组传递给该功能,以创建一个可用于减少的新通信器。