Parallel processing MPI\u通信级与MPI\u组级
我试图将8个处理器分成两个子组。其中一个子组包含两个处理器,例如,它们的秩分别为0和1。对于当前示例,我不需要其他组。下面上下文中的代码片段就是我用来实现这一目标的代码片段。但是,我一直在获取错误消息 我收到的一条错误消息如下: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
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