从另一个处理器调用变量

时间:2014-01-09 11:06:34

标签: fortran mpi mpi-rma

我正在Fortran77中编写一个并行程序。我有以下问题:

  1. 我有N个处理器。
  2. 每个处理器都包含一个大小为S的数组A.
  3. 使用某些函数,在每个处理器(比如等级X)上,我计算两个整数Y和Z的值,其中Z
  4. 我想将处理器Y上的A(Z)值加到处理器X上。
  5. 我想到的是首先从处理器X向处理器Y发送数值X,然后从处理器Y向处理器X发送A(Z)。但是由于处理器Y不知道数值X所以它是不可能的,所以它不知道从哪个处理器接收数值X.

    我试过,但我无法提出任何可以实现此操作的代码。所以我没有发布任何代码。

    编辑:

    我将尝试用一个例子来解释它。假设我在处理器X =(比如2)。在处理器2上,我计算两个整数的值,Y =(例如34)和Z =说(5)。我想在处理器34上使用A(5)的值来计算处理器2.我该怎么做?

    编辑:

    MPI论坛上有人给了我这段代码,非常清楚地说明了mpi_get的用法:

    program var_access
    
    implicit none
    include 'mpif.h'
    
    integer ierr
    integer i
    integer rank
    integer disp_int
    integer X, Y, Z
    integer S
    parameter (S = 10)
    integer A(S)
    integer AYS
    integer win, NP
    integer (kind=MPI_ADDRESS_KIND) lowerbound, size, realextent, disp_aint
    integer n
    integer, allocatable :: seed(:)
    real rnd(3)
    
    call MPI_Init(ierr)
    call MPI_Comm_size(MPI_COMM_WORLD,NP,ierr)
    call MPI_Comm_rank(MPI_COMM_WORLD,rank,ierr)
    
    ! Produce random numbers
    call random_seed(size = n)
    allocate(seed(n))
    do i=1, n
        seed(i) = i
    end do
    call random_seed(put = seed)
    call random_number(rnd)
    X = floor(NP*rnd(1))
    Y = floor(NP*rnd(2))
    Z = ceiling(S*rnd(3))
    
    ! Determine the size of one data element in the array in bytes
    call MPI_Type_get_extent(MPI_INT, lowerbound, realextent, ierr)
    disp_int = realextent
    ! Determine the size of the entire data array in bytes
    size = S * realextent
    ! create the actual memory window
    call MPI_Win_create(A, size, disp_int ,MPI_INFO_NULL, MPI_COMM_WORLD, win, ierr)
    
    ! Fill array A with some data
    do i = 1, S
        A(i) = S * rank + i
        if (rank.eq.Y) write (*,*) rank, i, A(i), rnd(1), rnd(2), rnd(3)
    end do
    
    
    ! Synchronize window
    call MPI_Win_fence(0, win, ierr)
    if(rank .eq. X) then
        disp_aint = Z - 1
        call MPI_Get(AYS, 1, MPI_INT, Y, disp_aint, 1, MPI_INT, win, ierr)
    endif
    
    ! Synchronize window, completing all accesses to it
    call MPI_Win_fence(0, win, ierr)
    if(rank .eq. X) then
        write (*,*) Y,Z,"# ", AYS
    endif
    
    call MPI_Win_free(win, ierr)
    call MPI_Finalize(ierr)
    
    end program var_access
    

1 个答案:

答案 0 :(得分:0)

  

但由于处理器Y不知道数字,所以不可能   值X,因此它不知道从哪个处理器接收   数值X来自。

实际上这是可能的。使用MPI_ANY_SOURCE作为MPI_Recv的源级别就足够了。您可以通过检查返回的状态来检测哪个处理器实际发送了数据。