【发布时间】:2015-01-26 05:24:30
【问题描述】:
我正在尝试使用 Fortran 90 和 MPI 实现数据传输,其中每个节点向每个其他节点发送一个特定的缓冲区,即对于 N 个节点,我有 N-1 个要发送的缓冲区,每个缓冲区都有不同的内容特定于接收节点。这涉及双循环和非阻塞发送/接收调用;这是代码:
program a2a
implicit none
include "mpif.h"
integer, parameter :: ILEN=4
integer :: nn,i,j,me,ierr
integer :: status(MPI_status_size)
integer, allocatable :: sndv(:),rcvv(:),ireq(:)
call MPI_init(ierr)
call MPI_comm_size(mpi_comm_world,nn,ierr)
nn=nn-1
call MPI_comm_rank(mpi_comm_world,me,ierr)
allocate(sndv(0:nn),rcvv(0:nn),ireq(0:nn))
do i=0,nn
sndv(i)=10*me+i
rcvv(i)=0
end do
do i=0,nn
if (i == me) then
do j=0,nn
if (i == j) cycle
call MPI_isend(sndv(j),ILEN,MPI_byte,j,1000+j,MPI_comm_world,ireq(j),ierr)
write(*,*) 1000+j,'Send - #',me,' -> #',j,': ',sndv(j),ireq(j)
end do
else
do j=0,nn
if (i == j) cycle
call MPI_irecv(rcvv(j),ILEN,MPI_byte,j,1000+j,MPI_comm_world,ireq(j),ierr)
write(*,*) 1000+j,'Recv0 #',i,' -> #',j,': ',rcvv(j),ireq(j)
end do
end if
end do
do j=0,nn
if (me == j) cycle
call MPI_wait(ireq(j),status,ierr)
write(*,*) 1000+j,'Recv1 #',me,' -> #',j,': ',rcvv(j),ireq(j)
end do
call MPI_barrier(MPI_comm_world,ierr)
do i=0,nn
write(*,*) 'Recv2 #',i,' -> #',me,': ',rcvv(i)
end do
call MPI_finalize(ierr)
end program a2a
只有两个节点的运行的预期结果是节点 0 向节点 1 发送“1”,节点 1 向节点 0 发送“10”。实际结果是似乎什么都没有发送,虽然没有死锁,标签和请求编号似乎是正确的。这里有什么问题?
托马斯
【问题讨论】:
-
我建议您通过
use mpi使用 mpi 模块,而不是 include。您可以免费获得几个错误检查,并且编译器要编译的代码更少。
标签: parallel-processing fortran mpi