将数组发送到单个进程

时间:2014-04-25 06:50:56

标签: mpi

我有一个大小为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

1 个答案:

答案 0 :(得分:0)

mpi_Irecvmpi_Isend是非阻止功能。这意味着,这些函数调用在传输完成之前返回。要解决您的问题,您可以

  • 使用屏蔽版mpi_Recvmpi_Send
  • 向您的解决方案添加mpi_Wait次调用,以等待非阻止调用完成。