fortran - 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 循环开头的代码块不是由单个处理器(我想要的)完成的吗?
解决方案
推荐阅读
- python - 从多个python模块重用一个类的同一个实例
- unity3d - unity 确保读/写已启用
- html - 非 gui 模式 html 报告
- reactjs - 将自己的属性添加到 firebase 中的用户对象(react,redux)
- eclipse - ClassNotFoundException Tomcat 7 服务器
- flash - ESP8266 (ESP01) 模块具有 1 MBit(约 128 KB)的闪存。那么为什么 EEPROM.begin(SIZE) 最大允许 4096 大小?
- c# - 输出数据集列唯一 ID,包括逗号分隔到存储过程的输入,请检查图像
- security - “训练”一个分支预测器是什么意思?
- hibernate - 使用休眠条件连接多个表
- android - 您如何使用 Android 的默认字体 (Roboto) 系列?