0

这是我的第一篇文章。预先感谢您的帮助。这是用于测试 MPI_SENDRECV 的非常短的代码,我不明白。但这是僵局,谁能告诉我为什么?

 PROGRAM sendrecv
  INCLUDE "mpif.h"
  INTEGER ibuf(20)
  CALL MPI_INIT(ierr)
  CALL MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
  CALL MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr)
  a=1
  b=2
  if (myid == 0) then
     call mpi_sendrecv(a,1,mpi_real,1,0,
 .                     b,1,mpi_real,1,0,
 .                     MPI_COMM_WORLD, status,ierr)
  elseif (myid == 1) then
     call mpi_sendrecv(b,1,mpi_real,0,0,
 .                     a,1,mpi_real,0,0,
 .                     MPI_COMM_WORLD,status,ierr)
  end if
  if (myid.eq.0) then
     write(*,*) a
  endif
  if (myid.eq.1) then
     write(*,*) b
  endif
  CALL MPI_FINALIZE(ierr)
  END
4

1 回答 1

0

正如@SteveBlackwell 所指出的,您使用myid的是myrank. 如果您使用:

CALL MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr) 

相反,那么您将完成一半。出现死锁是因为两个处理器(可能)都有myid = 0(注意,这种行为取决于编译器——其他编译器可能会将其设置为某个奇怪的数字,您的程序似乎可以工作,但不会传递任何消息)。

您的第二个问题是status隐式声明为实变量,但 MPI 需要一个具有 size 的整数数组MPI_STATUS_SIZE。这可能会产生各种影响——您可能会遇到段错误,或者更糟糕的是,由于 MPI 正在写入不应写入的缓冲区,因此可能会出现一些奇怪的内存错误。(或者,您可以使用,MPI_STATUS_IGNORE因为无论如何您都没有对状态做任何事情)。

正如@HighPerformanceMark 所指出的,最佳实践是在程序中显式键入所有内容并使用它IMPLICIT NONE来避免这些类型的问题。换句话说,如果您的子程序/模块/函数/主程序在声明中没有 IMPLICIT NONE,那么您应该有一个非常好的理由。

于 2012-06-13T13:02:55.263 回答