Fortran Coder

查看: 12033|回复: 4
打印 上一主题 下一主题

[讨论] 最近发现的一个问题,一直困扰我,看看没有大神给我解惑

[复制链接]

9

帖子

5

主题

0

精华

入门

F 币
57 元
贡献
35 点
跳转到指定楼层
楼主
发表于 2021-2-4 18:18:31 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sam295040799 于 2021-2-10 13:38 编辑

最近发现的一个问题,一直困扰我,看看没有大神给我解惑,有偿。
[Fortran] 纯文本查看 复制代码
       MODULE CDAS1


        REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: indt,ce,ce1,ce2
        real dzz

        ENDMODULE CDAS1


      PROGRAM cs


      USE CDAS1


      IMPLICIT NONE


        integer i,j,k,n,maxx,maxy,maxz,x1,x2,y1,y2,z1,z2
        real time1,time2


        dzz=0.6
        maxz=80;maxy=80;maxx=80
        allocate(indt(maxx,maxy,maxz),ce(0:maxx,0:maxy,0:maxz),ce1(0:maxx,0:maxy,0:maxz),ce2(0:maxx,0:maxy,0:maxz))
        indt=0;ce=0
       x1=10;x2=30              y1=10;y2=40
       z1=15;z2=35


            do k=1,maxz
            do j=1,maxy
            do i=1,maxx
            if(i>x1.and.i<x2) indt(i,j,k)=1            
            if(j>y1.and.j<y2) indt(i,j,k)=1
            if(k>z1.and.k<z2) indt(i,j,k)=1
            enddo
            enddo
            enddo


       call CPU_TIME(time1)


       do n=1,1000
        do k=1,maxz
        do j=1,maxy
        do i=1,maxx
        if( indt(i,j,k)==1) cycle
        ce(i,j,k)=ce1(i,j,k)-ce2(i,j-1,k)
        enddo
        enddo
        enddo
       enddo
      call CPU_TIME(time2)
      print*,'time',time2-time1


      ENDPROGRAM cs

这段程序在release下执行的,出现下面情况
这段程序里 if( indt(i,j,k)==1) cycle是对所有的i,j,k进行筛选,不满足条件的就进行ce(i,j,k)=dzz,但是结果发现没有if( indt(i,j,k)==1) cycle,ce(i,j,k)=dzz程序执行次数是80*80*80次,而有if( indt(i,j,k)==1) cycle,ce(i,j,k)=dzz程序执行次数,两者执行次数相差很多,但是耗时相差没这么多。
关于这个问题的解释就是,fortran循环是列循环,如果循环没有中断,循环速度很快,但是如果是跳跃循环,那这个循环速度就会变慢,再加上if(indt(i,j,k)==1)cycle,也耗时。但是没有找到好的办法让这个循环里带if()cycle 的代码 执行次数和时间 成比例。如果在debug执行,情况又不一样了



联系方式:二9五零4零柒玖玖(企鹅)



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

9

帖子

5

主题

0

精华

入门

F 币
57 元
贡献
35 点
沙发
 楼主| 发表于 2021-2-6 14:03:49 | 显示全部楼层
necrohan 发表于 2021-2-6 10:42
if( indt(i,j,k)==1)then
ce(i,j,k)=ce(i,j,k)
else


if( indt(i,j,k)==1)then
ce(i,j,k)=dzz
endif
我实际上只需要这部分,这部分执行时间和总时间不成比例
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-8 11:38

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表