MPI_IBcast 是否保证发送,即使某些等级不参与
Is MPI_IBcast guaranteed to send even if some ranks don't participate
我正在创建一个 MPI 程序,我试图在所有进程完成计算后立即将相同的数据发送到所有进程。这些进程的计算时间可能会有很大差异,所以我不希望一个处理器等待另一个。
根进程保证总是先发送。
我知道 MPI_Bcast 充当障碍,所以我尝试了 MPI_IBcast:
program main
use mpi
implicit none
integer rank, nprcos, ierror, a(10), req
call MPI_INIT(ierror)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nprcos, ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
a = rank
if(rank /= 2) then
call MPI_IBCAST(a, size(a), MPI_INTEGER, 0, MPI_COMM_WORLD, req, ierror)
call MPI_WAIT(req, MPI_STATUS_IGNORE, IERROR)
endif
write (*,*) 'Hello World from process: ', rank, 'of ', nprcos, "a = ", a(1)
call MPI_FINALIZE(ierror)
end program main
从我的实验看来,无论 "boycotting" 和 MPI_IBcast 排名如何,它总是适用于所有其他排名:
> $ mpifort test.f90 && mpiexec --mca btl tcp,self -np 4 ./a.out
Hello World from process: 2 of 4 a = 2
Hello World from process: 1 of 4 a = 0
Hello World from process: 0 of 4 a = 0
Hello World from process: 3 of 4 a = 0
这是一种有保证的行为,还是仅特定于我的 OpenMPI 实现?我还能如何实施呢?我只能想到循环 MPI_Isends.
不,这不能保证,通讯器中的所有等级都应该参加。在 MPI 中,这是集体通信的定义。
我正在创建一个 MPI 程序,我试图在所有进程完成计算后立即将相同的数据发送到所有进程。这些进程的计算时间可能会有很大差异,所以我不希望一个处理器等待另一个。
根进程保证总是先发送。
我知道 MPI_Bcast 充当障碍,所以我尝试了 MPI_IBcast:
program main
use mpi
implicit none
integer rank, nprcos, ierror, a(10), req
call MPI_INIT(ierror)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nprcos, ierror)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
a = rank
if(rank /= 2) then
call MPI_IBCAST(a, size(a), MPI_INTEGER, 0, MPI_COMM_WORLD, req, ierror)
call MPI_WAIT(req, MPI_STATUS_IGNORE, IERROR)
endif
write (*,*) 'Hello World from process: ', rank, 'of ', nprcos, "a = ", a(1)
call MPI_FINALIZE(ierror)
end program main
从我的实验看来,无论 "boycotting" 和 MPI_IBcast 排名如何,它总是适用于所有其他排名:
> $ mpifort test.f90 && mpiexec --mca btl tcp,self -np 4 ./a.out
Hello World from process: 2 of 4 a = 2
Hello World from process: 1 of 4 a = 0
Hello World from process: 0 of 4 a = 0
Hello World from process: 3 of 4 a = 0
这是一种有保证的行为,还是仅特定于我的 OpenMPI 实现?我还能如何实施呢?我只能想到循环 MPI_Isends.
不,这不能保证,通讯器中的所有等级都应该参加。在 MPI 中,这是集体通信的定义。