【问题标题】:mpi rank not valid in do loopmpi 等级在 do 循环中无效
【发布时间】:2013-08-01 22:46:34
【问题描述】:

我正在更新 fortran 中的程序以使用 MPI 运行,但遇到了排名未正确显示的问题。在这个子程序的开始,我调用MPI_COMM_RANK(MPI_COMM_WORLD,rank,ierr),它会返回正确的排名直到这一点:

  DO IY=2,NY+1
  DO IX=2,NX+1
   D(IX,IY)=(h_roms(IX,IY)+zeta(IX,IY))*maskr(IX,IY)
   call mpi_barrier(mpi_comm_world,ierr)      
   write(out,12) rank,ix,iy
12 format('disappearing?',i3,'ix:',i3,'iy',i3)           
  ENDDO       
  ENDDO

NY 和 NX 分别为 124,84,并且排名正确打印,直到 iy 变为 125,ix 为 3。之后它仅打印为 *** . IT 仍然会打印出所有内容两次(在 2 个处理器上运行),但排名无效或出现任何错误。我试过在 do 循环之后调用 MPI_COMM_RANK ,但仍然没有。任何想法将不胜感激。

【问题讨论】:

  • 我对 Fortran 并不太熟悉,但如果您按照您所说的那样调用 MPI_COMM_RANK,那不是您的问题。这几乎是 MPI 库中最简单的操作,因此很难搞砸。我建议您的问题可能出在其他地方。也许你不小心弄乱了排名变量?
  • 这正是我所希望的,但由于某种原因,它在该循环的末尾附近停止,并且该循环通常只包含那个计算。

标签: fortran mpi


【解决方案1】:

如果数字输出字段太小而无法包含您尝试写入的数字,Fortran 通常会打印一系列星号,即您的***。尝试将格式语句中的一些i3s 更改为i6 甚至i0;最后一种形式告诉编译器在一个字段中打印一个整数,该字段的宽度足以容纳其所有数字,但不能更宽。

【讨论】:

  • 我将其更改为 i0,它为所有剩余迭代提供了 2139095040 的排名
  • 对我来说这看起来像是一个未初始化的整数变量;某事,某处正在破坏rank。您的循环是否在您的阵列边缘运行? IY = 2,NY+1 是否将 y-index 设置为比 ys 的数量大一?
  • 我将它从运行 NY+1 更改为 NY 并解决了问题,现在我的问题是弄清楚为什么有人以这种方式编码它以纯粹以串行方式运行。感谢您的帮助。
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
相关资源
最近更新 更多