【发布时间】:2016-11-03 23:25:41
【问题描述】:
我正在尝试使用 MPI_Send() 和 MPI_Recv() 在子进程与其父进程之间进行通信,通过使用 MPI_Comm_spawn 创建如下所示:
Parent.f90
program master
use mpi
implicit none
integer :: ierr, num_procs, my_id, intercomm, i, array(10), tag
CALL MPI_INIT(ierr)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, my_id, ierr)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, num_procs, ierr)
if (.not. (ierr .eq. 0)) then
print*, "S.Unable to initilaize!"
stop
endif
if (my_id .eq. 0) then
call MPI_Comm_spawn("./child.out", MPI_ARGV_NULL, 1, MPI_INFO_NULL, my_id, &
& MPI_COMM_WORLD, intercomm, MPI_ERRCODES_IGNORE, ierr)
call MPI_Send(array, 255, MPI_INTEGER, my_id, tag, intercomm, ierr)
endif
call MPI_Finalize(ierr)
end program master
Child.f90
program name
use mpi
implicit none
! type declaration statements
integer :: ierr, parent, my_id, n_procs, i, array(10), tag, intercomm
logical :: flag, high
! executable statements
call MPI_Init(ierr)
call MPI_Initialized(flag, ierr)
call MPI_Comm_get_parent(parent, ierr)
call MPI_Comm_rank(MPI_COMM_WORLD, my_id, ierr)
call MPI_Comm_size(MPI_COMM_WORLD, n_procs, ierr)
print *, "Initilaized? ", flag
print *, "My mommy is: ", parent
print *, "My rank is:", my_id
tag = 1
call MPI_Recv(array, 255, MPI_INTEGER, MPI_ANY_SOURCE, tag, parent, MPI_STATUS_IGNORE, ierr)
print *, "Client received array."
call MPI_Finalize(ierr)
end program name
运行上述程序时,Parent 似乎运行良好,但 Child 从不打印:“Client received array.”,让我相信我在发送/接收方面搞砸了。
如果不清楚我想要实现什么,我希望父母产生一个孩子,向该孩子发送一个数组,孩子处理数组,孩子将数组发送回父母。 (斜体还没有写出来,我想先把这个基本的通信搞好)
此刻,当我运行:mpiexec -np 1 parent.out,孩子打印:
Initilaized? T
My mommy is: 3
My rank is: 0
但不是“客户端收到的数组”。
【问题讨论】: