24小时热门版块排行榜    

CyRhmU.jpeg
查看: 893  |  回复: 4

iZeeyo

新虫 (初入文坛)

[求助] 在fortran程序加上openmp并行后耗时比不加并行更慢

在此段程序中,串行计算用时15.5s,运用openmp用两个线程计算,用时17.3s,运用openmp用4个线程计算,用时55s!!!!运行的结果是一样的,但是这个耗时也太不对劲了,希望有经验的大佬指点一下!!!感谢!
程序略长,但是结构简单,用了三个部分,在计算函数部分使用了并行。


module com!全局变量
   implicit none
    integer a,ia
    parameter (a=10000,ia=3)   
    integer summ(a,a),sumn(a,a),su(ia,3000,3000)
end
   
program xunhuan!主程序
use com
implicit none
include 'omp_lib.h'

integer i,j,ic
real(kind=8) time_begin,time_end
i=a
j=a

call omp_set_num_threads(2)
call cpu_time(time_begin)
call loop(i,j)
call cpu_time(time_end)  

open(10,file="result.txt"
write(10,*) time_end - time_begin
do i=1,500
    do j=1,500
   write(10,*) i,j,summ(i,j), sumn(i,j),summ(i,j)+sumn(i,j)
   do ic=1,ia
     write(10,*)   su(ic,i,j)
   end do
    end do
end do
close(10)
end
   
subroutine loop(ii,jj)!计算函数
use com
implicit none
integer i1,j1,ii,jj,aa1,bb1,aa2,bb2,cc1,cc2,dd1,dd2,ib

!$omp parallel private(aa1,bb1,aa2,bb2,cc1,cc2,dd1,dd2) shared(summ,sumn,su,ii,jj)
!$omp do

do i1=1,ii
do j1=1,jj   
     if(abs(mod(i1,2))==1)then
     aa1=3*i1-j1
     bb1=i1
     else if(abs(mod(i1,2))==0) then
         aa1=i1
         bb1=3*i1-j1
     end if
     cc1=min(aa1,bb1)
     if(abs(i1-25)>=20)then
         aa2=abs(i1-20)*2-j1
         bb2=abs(j1-50)+i1
     else if(abs(i1-25)<20)then
         aa2=abs(i1-10)*2-j1
         bb2=abs(j1-70)+i1
     end if
     cc2=floor(sqrt(1.0*aa2*bb2/abs(aa2-bb2)))
     
     dd1=cc1+i1
     dd2=cc2+j1
         
         
   summ(i1,j1)=floor(1.0*sqrt(abs(0.1*(dd1*(j1+1)-i1*dd2)*min(cc1,cc2))/22))+floor(1.0*sqrt(abs(0.01*cc1*cc2)))
   sumn(i1,j1)=floor(1.0*sqrt(abs(0.1*((i1+1)*dd2-dd1*j1)*max(cc1,cc2))/22))+floor(1.0*sqrt(abs(0.01*cc1*cc2)))
if(i1<=3000.and.j1<=3000)then
   do ib=1,ia
       su(ib,i1,j1)=floor(sqrt(1.0*abs(summ(i1,j1)*cc1)))+floor(sqrt(1.0*abs(sumn(i1,j1)*cc2)))+ib
   end do
end if

end do
end do

!$omp end do
!$omp end parallel

    end
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

luwis

至尊木虫 (职业作家)


jjdg: 金币+1, 感谢参与 2018-12-25 11:55:52
通常直接选取物理内核数目,线程数目/2,到最优结果。大概率都对。

发自小木虫Android客户端
2楼2018-12-07 16:16:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

luwis

至尊木虫 (职业作家)

引用回帖:
2楼: Originally posted by luwis at 2018-12-07 17:16:36
通常直接选取物理内核数目,线程数目/2,到最优结果。大概率都对。

比如8核,通常就是8最优。别用16。

发自小木虫Android客户端
3楼2018-12-07 16:18:05
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

iZeeyo

新虫 (初入文坛)

引用回帖:
3楼: Originally posted by luwis at 2018-12-07 16:18:05
比如8核,通常就是8最优。别用16。
...

两个线程用的双核电脑算的,四个线程条件是用的服务器算的,应该不存在这个问题吧
4楼2018-12-07 18:04:44
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

1225839327

新虫 (初入文坛)


jjdg: 金币+1, 感谢参与 2018-12-25 11:56:00
Call cpu time不能用来计时openmp并行,得到的是cpu运行总时间。openmp要用omp_get_wtime时间函数才能得到实际时间。

发自小木虫Android客户端
5楼2018-12-25 07:17:51
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 iZeeyo 的主题更新
信息提示
请填处理意见