我的问题可能很愚蠢,但我仍然会问它以确定!
问题:您是否希望下面的两个代码使用 MPI_Comm_Split 来构建 1 个子通信器以相同的方式工作?(例如,假设我正在使用 6 个 proc 运行代码,排名在 0 到 5 之间)
注意:代码在 fortran 90 中,带有 intel 编译器 2019,我使用 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 在 2 个代码中的调用方式不同,但对我来说,它的行为应该相同,但我不确定......我读到 Mpi_Comm_Split 必须在同一行调用,但 procs 如何知道调用Mpi_Comm_Split 是在一行或另一行完成的(对我来说没有任何意义)?!
注意:使用 Mpich 和 intel fortran,我对其进行了测试,并且都实现了通信器拆分工作,但我担心不同 Mpi 编译器的行为......