调用 MPI_Comm_Split 函数
Calling MPI_Comm_Split function
我的问题可能很愚蠢,但我还是要问清楚!
问题: 你希望下面的两个代码使用 MPI_Comm_Split 来构建 1 个子通信器吗? (例如,假设我是 运行 具有 6 个等级在 0 到 5 之间的过程的代码)
注意: 代码在带有英特尔编译器 2019 的 Fortran 90 中,我使用 Mpich 作为 Mpi。
代码 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
代码 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 必须是在同一行调用,但是 procs 如何知道 Mpi_Comm_Split 的调用是在一行或另一行完成的(这对我来说没有任何意义)?!
注意: 使用 Mpich 和 intel fortran,我测试了它并且通信器拆分的实现都有效,但我担心不同 Mpi 编译器的行为......
假设您正确地声明了 color
,那么这两个代码是等价的。
MPI_Comm_split()
是一个集体操作,因此必须由父通信器的所有级别调用。那确实不强制调用必须由同一行代码执行。
我的问题可能很愚蠢,但我还是要问清楚!
问题: 你希望下面的两个代码使用 MPI_Comm_Split 来构建 1 个子通信器吗? (例如,假设我是 运行 具有 6 个等级在 0 到 5 之间的过程的代码)
注意: 代码在带有英特尔编译器 2019 的 Fortran 90 中,我使用 Mpich 作为 Mpi。
代码 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
代码 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 必须是在同一行调用,但是 procs 如何知道 Mpi_Comm_Split 的调用是在一行或另一行完成的(这对我来说没有任何意义)?!
注意: 使用 Mpich 和 intel fortran,我测试了它并且通信器拆分的实现都有效,但我担心不同 Mpi 编译器的行为......
假设您正确地声明了 color
,那么这两个代码是等价的。
MPI_Comm_split()
是一个集体操作,因此必须由父通信器的所有级别调用。那确实不强制调用必须由同一行代码执行。