调用MPI_Comm_Split函数

问题描述 投票:0回答:1

我的问题可能很愚蠢,但我还是要确保它!

问题:您希望下面的两个代码使用MPI_Comm_Split来构建1个子通信器也能正常工作吗? (例如,假设我正在使用6个proc(等级介于0到5之间)运行代码)

NB:代码在intran编译器2019中的fortran 90中,我将Mpich用于Mpi。

CODE 1

call Mpi_Init(ierror)
call Mpi_Comm_Rank(mpi_comm_world,rank,ierror)

if (rank > 2) then
    call Mpi_Comm_Split(mpi_comm_world,0,rank,new_comm,ierror)
else
    call Mpi_Comm_Split(mpi_comm_world,mpi_undefined,rank,new_comm,ierror)
endif

CODE 2

call Mpi_Init(ierror)
call Mpi_Comm_Rank(mpi_comm_world,rank,ierror)

if (rank > 2) then
    color = 0
else
    color = mpi_undefined
endif

call Mpi_Comm_Split(mpi_comm_world,color,rank,new_comm,ierror)

在两个代码中,Mpi_Comm_Split的调用方式不同,但是对我来说,它的行为应相同,但是我不确定...我读到必须在同一行调用Mpi_Comm_Split,但是proc如何知道Mpi_Comm_Split的调用是在一行或另一行完成的(对我没有任何意义)?!

NB:使用Mpich和intel fortran,我对其进行了测试,并且测试了通信器拆分工作,但是我担心不同的Mpi编译器的行为...

fortran mpi communicator
1个回答
0
投票

假设您正确声明了color,两个代码是等效的。

MPI_Comm_split()是一个集体运算,因此必须由上级通信器的所有等级调用。这确实not强制调用必须由同一行代码执行。

© www.soinside.com 2019 - 2024. All rights reserved.