【发布时间】:2016-04-28 13:12:57
【问题描述】:
我是 Fortran90 和 MPI 的新手。我有一个循环,它根据每个单独的过程进行不同的迭代。在其中,我有一个嵌套循环,正是在这里我进行了我想要的计算以及各个循环的元素。但是,我想将所有这些数据、x、y 以及使用 x 和 y 计算的值发送到我的根进程 0。从这里,我想将所有数据写入“xy 计算”的格式。
program fortranMPI
use mpi
!GLOBAL VARIABLE DECLARATION
real :: step = 0.5, x, y, comput
integer :: count = 0, finalCount = 5, outFile = 20, i
!MPI
integer :: ierr, myrank, mysize, status(MPI_STATUS_SIZE)
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,myrank,ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,mysize,ierr)
if(myrank == 0) then
!I want to gather my data here?
end if
do i = 1, mysize, 1
if(myrank == i) then
x = -2. + (myrank - 1.)*step
do while (x<= 2.)
y= -2.
do while (y<=2.)
!Here is where I am trying to send my data!
y = y + step
end do
x = x + (mysize-1)*(step)
end do
end if
end do
call MPI_FINALIZE(ierr)
end program fortranMPI
我一直在尝试传递数据时遇到问题!如果有人可以帮助我,那就太好了!抱歉,如果这比我做的简单,我仍在尝试找出 Fortran/MPI。提前致谢!
【问题讨论】:
-
如我所见,带有
i索引的循环是没用的。此外,根进程不进行任何计算。所以if(myrank == i) then应该变成if(myrank /= 0) then。由于在计算之前没有进程收到任何数据,因此您应该在计算之后收集数据。 MPI_gather 将成为您的朋友。使用此评论进行改进,如果您需要进一步的帮助,请回复评论。 -
@innoSPG 感谢您的帮助。对带有 i 索引的循环有意义,应该看到这一点。我尝试使用 MPI_Gather:
if(myrank == 0) then call MPI_GATHER(x, 1, MPI_REAL, xbuf, 1, MPI_REAL, 0, MPI_COMM_WORLD, ierr) open (unit=outFile,file="mandelbrotDynamic.txt",action="write",status="replace") write(outFile,*) xbuf close(outFile) end if但是,这只是卡住并且永远不会完成。我只是想通过收集 1 x 值来测试它,但由于我是 MPI 和 Fortran 的新手,我可能做错了。任何帮助都会很棒!谢谢! -
MPI_GATHER是一个集体操作,所以通信器中的所有进程都必须调用它。而master会接收到所有进程的数据。
标签: math fortran mpi fortran90 computation