Parallel processing MPI\u通信级与MPI\u组级

Parallel processing MPI\u通信级与MPI\u组级,parallel-processing,fortran,mpi,fortran90,Parallel Processing,Fortran,Mpi,Fortran90,我试图将8个处理器分成两个子组。其中一个子组包含两个处理器,例如,它们的秩分别为0和1。对于当前示例,我不需要其他组。下面上下文中的代码片段就是我用来实现这一目标的代码片段。但是,我一直在获取错误消息 我收到的一条错误消息如下: Fatal error in PMPI_Comm_rank: Invalid communicator, error stack: PMPI_Comm_rank(121): MPI_Comm_rank(MPI_COMM_NULL, rank=0x7fff5a451e10

我试图将8个处理器分成两个子组。其中一个子组包含两个处理器,例如,它们的秩分别为0和1。对于当前示例,我不需要其他组。下面上下文中的代码片段就是我用来实现这一目标的代码片段。但是,我一直在获取错误消息

我收到的一条错误消息如下:

Fatal error in PMPI_Comm_rank: Invalid communicator, error stack:
PMPI_Comm_rank(121): MPI_Comm_rank(MPI_COMM_NULL, rank=0x7fff5a451e10) failed
PMPI_Comm_rank(73).: Null communicator.
如果我将第15行中的语句更改为
callmpi\u GROUP\u RANK(…)
,则不会显示错误消息。但是,我不知道是否可以使用group\u rank作为子例程的输入参数,如
MPI\u SEND
MPI\u RECV
。谁能告诉我我的代码有什么问题吗?谢谢

背风


MPI\u COMM\u CREATE
返回
MPI\u COMM\u NULL
未包含在
new\u组中的列组中。使用
MPI\u COMM\u NULL
调用
MPI\u COMM\u RANK
会导致出现错误。您应该使用
IF
语句来防止:

call MPI_COMM_CREATE(MPI_COMM_WORLD, new_group, new_comm, ierr)
if (new_comm /= MPI_COMM_NULL) then
  !
  ! The process is part of new_group - do something useful
  !
  call MPI_COMM_RANK(new_comm, new_rank, ierr)
  ! ...
else
  !
  ! The process is not part of new_group - do nothing
  !
end if
call MPI_COMM_CREATE(MPI_COMM_WORLD, new_group, new_comm, ierr)
if (new_comm /= MPI_COMM_NULL) then
  !
  ! The process is part of new_group - do something useful
  !
  call MPI_COMM_RANK(new_comm, new_rank, ierr)
  ! ...
else
  !
  ! The process is not part of new_group - do nothing
  !
end if