MPI Fortran代码问题

MPI Fortran代码问题,fortran,mpi,Fortran,Mpi,我正在尝试运行这个MPI Fortran代码。有几个问题: 1) 当我运行这段代码时,我希望程序将“输入间隔数:(0退出)”写入屏幕,然后询问我n。相反,它先问我n!!!为什么? 2) 如果我没有注释掉“goto 10”一行,程序会一直问我n,不会再显示任何其他内容 3) 如果我注释掉“goto 10”,程序会询问我n,然后写出结果。但是,问题是每次程序编写部分结果时,都不是完整的结果。它会截断输出!!以下是我连续三次运行程序的输出: > mpiexec -n 40 ./a.out 100

我正在尝试运行这个MPI Fortran代码。有几个问题:

1) 当我运行这段代码时,我希望程序将“输入间隔数:(0退出)”写入屏幕,然后询问我n。相反,它先问我n!!!为什么?

2) 如果我没有注释掉“goto 10”一行,程序会一直问我n,不会再显示任何其他内容

3) 如果我注释掉“goto 10”,程序会询问我n,然后写出结果。但是,问题是每次程序编写部分结果时,都不是完整的结果。它会截断输出!!以下是我连续三次运行程序的输出:

> mpiexec -n 40 ./a.out
10000000
 Enter the number of intervals: (0 quits)
 pi is    3.14159265358978      Error is   1.287858708565182E-014
 time is   1.687502861022949E-002  seconds

> mpiexec -n 40 ./a.out
10000000
 Enter the number of intervals: (0 quits)
 pi is    3.14159265358978      Error is   1.287858708565182E-014
 time is   1.68750286102

> mpiexec -n 40 ./a.out
10000000
 Enter the number of intervals: (0 quits)
 pi is    3.14159265358978      Error is   1.287858708565182E-014
 time is   1.687502861022949E-002  se
有人知道发生了什么吗?我提前感谢你的帮助

      program main
      use mpi
      double precision starttime, endtime
      double precision  PI25DT
      parameter        (PI25DT = 3.141592653589793238462643d0)
      double precision  mypi, pi, h, sum, x, f, a
      double precision starttime, endtime
      integer n, myid, numprocs, i, ierr

      f(a) = 4.d0 / (1.d0 + a*a)   !   function to integrate

      call MPI_INIT(ierr)
      call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
      call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)

 10   if ( myid .eq. 0 ) then
         print *, 'Enter the number of intervals: (0 quits) '
         read(*,*) n
      endif
      starttime = MPI_WTIME()
!                                 broadcast n
      call MPI_BCAST(n,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)
!                                 check for quit signal
      if ( n .le. 0 ) goto 30
!                                 calculate the interval size
      h   = 1.0d0/n
      sum = 0.0d0
      do 20 i = myid+1, n, numprocs
         x   = h * (dble(i) - 0.5d0)
         sum = sum + f(x)
 20   continue
      mypi = h * sum
!                                 collect all the partial sums
      call MPI_REDUCE(mypi,pi,1,MPI_DOUBLE_PRECISION,MPI_SUM,0, &
                      MPI_COMM_WORLD,ierr)
!                                 node 0 prints the answer.
      endtime = MPI_WTIME()
      if (myid .eq. 0) then
         print *, 'pi is ', pi, 'Error is ', abs(pi - PI25DT)
         print *, 'time is ', endtime-starttime, ' seconds'
      endif
      go to 10
 30   call MPI_FINALIZE(ierr)
      stop
      end

您必须显式刷新输出。我不记得fortran是否有标准的flush函数,如果flush不起作用,请尝试flush


基本上会发生什么,你的进程零缓冲输出,除非显式地告诉它显示,否则你会得到一个有趣的东西,你必须显式地刷新你的输出。我不记得fortran是否有标准的flush函数,如果flush不起作用,请尝试flush


基本上会发生什么,你的进程零缓冲区输出,除非显式地告诉它显示,否则你最终会得到一个有趣的东西

这个程序设计为通过最后的“goto 10”循环。打破这一局面的唯一方法是使n有一个值,该程序设计为通过末尾的“goto 10”循环。打破这一点的唯一方法是让n有一个值。你阅读列表中的下一篇论文应该是著名的迪克斯特拉的《反对GO-to声明的案例》。你阅读列表中的下一篇论文应该是著名的迪克斯特拉的《反对GO-to声明的案例》。谢谢,它成功了!但它如何解决后藤问题呢?你知道吗?Fortran 2003包含一个flush语句。许多编译器已经包含了它。有些人在2003年语言标准之前就有了它或它的变体。我从来没有用过它。是否因为MPI而有必要?Bahman flash确保在程序完成之前强制打印输出缓冲区。Fortran输出和C(mpi是用C编写的)以奇怪的方式交互。@M.S.B.Fortran和C/mpi输出流不同步。在并行程序中,基本上输出是异步的。谢谢,它成功了!但它如何解决后藤问题呢?你知道吗?Fortran 2003包含一个flush语句。许多编译器已经包含了它。有些人在2003年语言标准之前就有了它或它的变体。我从来没有用过它。是否因为MPI而有必要?Bahman flash确保在程序完成之前强制打印输出缓冲区。Fortran输出和C(mpi是用C编写的)以奇怪的方式交互。@M.S.B.Fortran和C/mpi输出流不同步。在并行程序中,输出基本上是异步的。
MainLoop: do
   .....
   if (n .le. 0) exit MainLoop
   ....
end do MainLoop