Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran MPI_WTIME没有按要求给我加速_Fortran_Mpi - Fatal编程技术网

Fortran MPI_WTIME没有按要求给我加速

Fortran MPI_WTIME没有按要求给我加速,fortran,mpi,Fortran,Mpi,这里我使用MPI_WTIME()来查找执行时间。似乎当我增加处理器的数量时,我没有得到加速。在这段代码中,我有m=3(我使m等于处理器的数量)。我使用mpirun-np 3 sp.exe运行。现在我改为m=10并使用mpirun-np 10 sp.exe运行。我应该少点时间,不是吗?或者我在这里遗漏了什么。以前社区在一些问题上帮助过我,现在我又遇到了另一个问题。如果有人能指出一些问题,我会非常感谢您的帮助。以do循环开头的代码块不是由双处理器(我想要的)完成的吗?您总是有m=n?如果是这样,看起

这里我使用MPI_WTIME()来查找执行时间。似乎当我增加处理器的数量时,我没有得到加速。在这段代码中,我有m=3(我使m等于处理器的数量)。我使用mpirun-np 3 sp.exe运行。现在我改为m=10并使用mpirun-np 10 sp.exe运行。我应该少点时间,不是吗?或者我在这里遗漏了什么。以前社区在一些问题上帮助过我,现在我又遇到了另一个问题。如果有人能指出一些问题,我会非常感谢您的帮助。以do循环开头的代码块不是由双处理器(我想要的)完成的吗?

您总是有
m=n
?如果是这样,看起来你在做弱扩展,所以你的目标是在增加MPI任务数量和问题大小时保持解决时间不变。实际上,如果m=n(公平地说,OP没有说这是一般情况),那么每个进程的工作量会随着进程数量的增加而增加,我不知道你在这里做什么。对于加速,总体思路是有一个特定规模的全局问题,并将其拆分,以便每个过程都解决部分问题。进程数量加倍意味着每个进程都有一个更小的子问题要解决,而当所有子问题同时完成时,整个问题得到更快的解决。因此,您有一个固定的问题大小和不同的进程数量。您正在改变全局问题的大小和进程的数量。另外,在风格上,请使用mpi模块,而不是包含include文件,它将在编译时捕获代码中更多的错误,并且不要使用不可移植的实数(kind=8),使用子例程中使用的更好的样式。还要注意常数有一种类型,如果不一致地使用它,可能会失去精度。最后,使用模块子程序比使用外部子程序要好得多——同样,在编译时,您会在代码中发现更多错误。我也有一个串行代码,我所做的是对串行和并行程序使用相同的m I.e m=3。使用1个处理器串行运行,使用3个处理器并行运行。现在我假设m=10表示两者,用1运行串行,用10并行。和预期的加速。是否加速=串行1进程/并行n进程?我想在m个处理器中分发的代码do循环是否真的是分布式的,每个处理器都在做各自的工作?不知道是否每个具有各自列组的处理器分别执行该循环。为了达到MPI代码的这一点,这个社区帮助了我很多。谢谢你
Program Main
implicit none
include 'mpif.h'
!Define parameters
integer::my_rank,p2,n2,ierr,source
integer, parameter :: n=3,m=3,o=m*n
real(kind=8) aaa(n),ddd(n),bbb(n),ccc(n),xxx(n),b(m,n),start, finish
integer i, j
real h
real(kind=8),dimension(:),allocatable::sol1
h=0.25
b=0
do i=1,m
b(i,i)=1/(1.2**i)
b(i,i-1)=-b(i,i)
enddo

call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD,p2,ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD,my_rank,ierr)
allocate(sol1(o))
start=MPI_WTIME()
do i=1,n

aaa(i)=-1/h**2
bbb(i)=2/h**2+b(my_rank+1,my_rank+1)
ccc(i)=-1/h**2
ddd(i)=1/h**2
enddo
call thomas(aaa,bbb,ccc,ddd,xxx,n)
finish=MPI_WTIME()
print*, finish-start
write(*,*) xxx, my_rank
call MPI_GATHER(xxx,n, MPI_REAL, sol1,n,MPI_REAL8,0, MPI_COMM_WORLD,ierr)
print*,sol1
call MPI_FINALIZE(ierr)
end program main

subroutine thomas(ld,md,ud,rh,solution,n)
implicit none
    integer,parameter :: r8 = kind(1.d0)
    integer,intent(in) :: n
    real(r8),dimension(n),intent(in) :: ld,md,ud,rh
    real(r8),dimension(n),intent(out) :: solution
    real(r8),dimension(n) :: P,Q
    real(r8) :: m
    integer i
    P(1) = ud(1)/md(1)
    Q(1) = rh(1)/md(1)
     do i = 2,n
       m = md(i)-p(i-1)*ld(i)
       P(i) = ud(i)/m
       Q(i) = (rh(i)-Q(i-1)*ld(i))/m
     end do
     solution(n) = Q(n)
    do i = n-1, 1, -1
      solution(i) = Q(i)-P(i)*solution(i+1)
    end do

end subroutine thomas