我有一个大小为nx * ny的数组。数组中的数据是nrows * ncols进程。我想在一个进程中将数组的所有各个部分发送到一个数组,比如进程0。
我是这样做的:我执行两个do循环,一个是带有变量x的nrows,另一个是带有变量y的ncols。在每个循环中,我找到了行和coloumn与x和y相同的进程,并使用mpi_isend将数据发送到进程0,之后,再次在同一循环进程0中通过mpi_irecv接收子数组。
我实际上尝试了这个问题,然后问题是进程0继续接收尚未发送的数据!我甚至尝试使用mpi_barrier但没有成功。以下是我的代码。有人可以帮我吗?感谢。
do x=0,grid%nrows
do y=0,grid%ncols
! Finding the relevant process and sending
if ((grid%row==x) .and. (grid%col==y)) then
call MPI_ISEND(tempp,ctot,MPI_DOUBLE_PRECISION,0, &
& grid%proc,MPI_COMM_WORLD,ierr)
end if
! Process 0 receives data
if (grid%proc==0) then
call MPI_IRECV(temp0(2*grid%xl:2*grid%xl+2*grid%mx-1, &
& :,1:size(v%a,4)), &
& ctot,MPI_DOUBLE_PRECISION, &
& x*grid%ncols+y,x*grid%ncols+y,MPI_COMM_WORLD,stat,ierr)
end if
end do
end do