【问题标题】:MPI_RECV receives 0 value when a variable is used as the source, but recieves proper value when the source number is hard codedMPI_RECV 在变量用作源时接收到 0 值,但在源编号是硬编码时接收到正确值
【发布时间】:2011-04-05 23:09:16
【问题描述】:

我正在尝试从作为 DO 循环的一部分处理的多个变量中接收一个变量。但是,如果我使用变量来表示处理器编号,则操作后变量的值为0。如果我直接输入处理器编号,它工作正常。奇怪的是,完全相同的代码在程序的早期运行良好。对我的问题有什么想法吗?

  DO s = 1,numproc-1,1
        CALL MPI_RECV( numZERO, 1, MPI_INTEGER, s, 1, MPI_COMM_WORLD, status, ierr )
        WRITE(*,*)'s',s,'numZERO',numZERO
  END DO

给予:

  s   1   numZERO   0
  s   2   numZERO   0 ...

编码时:

  CALL MPI_RECV( numZERO, 1, MPI_INTEGER, 1, 1, MPI_COMM_WORLD, status, ierr )
  WRITE(*,*)'1 numZERO',numZERO
  CALL MPI_RECV( numZERO, 1, MPI_INTEGER, 2, 1, MPI_COMM_WORLD, status, ierr )
  WRITE(*,*)'2 numZERO',numZERO

我明白了

  1 numZERO   1
  2 numZERO   2 ...

s 是一个整数。

【问题讨论】:

  • 你确定 s 是整数而不是隐含的实数吗?
  • 你检查过ierr的值吗?错误代码列表见链接:mcs.anl.gov/research/projects/mpi/www/www3/MPI_Recv.html
  • 你能把代码贴在某个地方吗(可能是pastebin.com)?这显然不应该发生,而且您发布的代码没有任何问题,所以问题一定出在其他地方......无论如何,正如 brady 建议的那样,我也会检查ierr

标签: fortran mpi


【解决方案1】:

"ierr" 将毫无用处。 Fortran MPI 实现默认不返回任何内容。他们知道你不会去检查它,所以作者会用错误来轰炸而不是传递有用的东西。您可以请求 MPI 返回错误。

您可能会检查“状态”,因为这在极少数情况下很有用。

“S”应该是正确大小的整数(通常是整数*4)。这就是我认为错误的全部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2021-08-17
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多