首页 > 解决方案 > MPI_WTIME 没有按要求给我加速

问题描述

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

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

标签: fortranmpi

解决方案


推荐阅读