| 查看: 2185 | 回复: 3 | ||
[求助]
怎样把用Fortran编写的程序改写为并行程序 已有2人参与
|
|
有没懂Fortran并行编程的,目前我面临的一个问题:用Fortran 编写的程序在服务器上跑了几天就不出结果,想把它改成并行的用多核计算,但没学过并行的,所以很头疼,需要一位大神帮帮我。或者是优化一下程序的算法,下面一段程序,用单核计算跑的太久,怎样改进一下算法: subroutine initial_condition() use global implicit none real :: r1, p1 = 0.5 do i = 1,n call random_number(r1) if(r1 < p1)then s(i) = 1.0 else s(i) = -1.0 end if sum1 = sum1 + s(i) end do return end subroutine mcs() use global implicit none integer :: ii real :: r2, r3, sum2 = 0.0 real :: ws(n) do ii = 1,n sum2 = 0.0 call random_number(r2) i = n*r2 + 1 sum1 = sum1 - s(i) do j = 1,n if(ad(i,j) == 1)then sum2 = sum2 + s(j) end if end do if(sum2<0)then ws(i) = (1-(1-2*q)*s(i)*(-1.0))/2 else if(sum2>0)then ws(i) = (1-(1-2*q)*s(i)*(1.0))/2 else ws(i) = 0.5 end if call random_number(r3) if(r3 <= ws(i))then s(i) = -s(i) else s(i) = s(i) end if sum1 = sum1 + s(i) end do return end !**************************Ising dynamics******************************* subroutine dynamics() use global implicit none integer :: mm, t = 0 real :: sum3 = 0.0, sum4 = 0.0, sum5 = 0.0 real :: m(time) do mm = 1,n1 q = q + 0.005 call initial_condition() do while(t < time) call mcs() t = t + 1 m(t) = abs(sum1/n) if(t>200000)then sum3 = sum3 + m(t)**4 sum4 = sum4 + m(t)**2 sum5 = sum5 + m(t) end if end do MNq(mm) = sum5/(time-200000) UNq(mm) = 1 - (sum3/(time-200000))/(3*((sum4/(time-200000))**2)) t = 0 sum1 = 0.0 sum3 = 0.0 sum4 = 0.0 sum5 = 0.0 end do return end |
» 猜你喜欢
体制内长辈说体制内绝大部分一辈子在底层,如同你们一样大部分普通教师忙且收入低
已经有12人回复
过年走亲戚时感受到了所开私家车的鄙视链
已经有9人回复
今年春晚有几个节目很不错,点赞!
已经有10人回复
情人节自我反思:在爱情中有过遗憾吗?
已经有10人回复
基金正文30页指的是报告正文还是整个申请书
已经有5人回复

2楼2017-04-25 13:47:35

3楼2017-04-25 13:51:45
4楼2018-06-07 09:32:54













回复此楼