0

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

  1. 我有 N 个处理器。
  2. 每个处理器包含一个大小为 S 的数组 A。
  3. 使用某个函数,在每个处理器上(比如 X 级),我计算两个整数 Y 和 Z 的值,其中 Z < S(Y 和 Z 的值在每个处理器上都不同)。
  4. 我想将处理器 Y 上的 A(Z) 的值传递给处理器 X。

我想首先将数值 X 从处理器 X 发送到处理器 Y,然后将 A(Z) 从处理器 Y 发送到处理器 X。但这是不可能的,因为处理器 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
4

1 回答 1

0

但这是不可能的,因为处理器 Y 不知道数值 X,因此它不知道从哪个处理器接收数值 X。

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

于 2014-01-24T15:14:36.430 回答