Fortran Coder

查看: 137|回复: 6

高难度的三维以上数值如何快速存储问题

[复制链接]

7

帖子

4

主题

0

精华

入门

F 币
45 元
贡献
27 点
发表于 2021-2-4 15:39:34 | 显示全部楼层 |阅读模式
本帖最后由 sam295040799 于 2021-2-6 09:55 编辑

最近发现的一个问题,一直困扰我,看看没有大神给我解惑,有偿。


       MODULE CDAS1


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

        ENDMODULE CDAS1


      PROGRAM cs


      USE CDAS1


      IMPLICIT NONE


        integer i,j,k,n,maxx,maxy,maxz
        real time1,time2


        dzz=0.6
        maxz=80;maxy=80;maxx=80
        allocate(indt(maxx,maxy,maxz),ce(maxx,maxy,maxz))
        indt=0;ce=0




            do k=1,maxz
            do j=1,maxy
            do i=1,maxx
            if(i<40) indt(i,j,k)=1
            enddo
            enddo
            enddo


       call CPU_TIME(time1)


       do n=1,50000
        do k=1,maxz
        do j=1,maxy
        do i=1,maxx
        if( indt(i,j,k)==1) cycle
        ce(i,j,k)=dzz
        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程序执行次数是40*80*80次,两者执行次数相差一倍,但是耗时很接近。
关于这个问题的解释就是,fortran循环是列循环,如果循环没有中断,循环速度很快,但是如果是跳跃循环,那这个循环速度就会变慢,再加上if(indt(i,j,k)==1)cycle,也耗时。但是没有找到好的办法让这个循环里带if()cycle 的代码 执行次数和时间 成比例。如果在debug执行,情况又不一样了

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


回复

使用道具 举报

586

帖子

1

主题

0

精华

大宗师

F 币
2908 元
贡献
1836 点
发表于 2021-2-4 15:51:12 | 显示全部楼层
计算量太小,讨论效率没有意义。程序启动时间占比太大。

586

帖子

1

主题

0

精华

大宗师

F 币
2908 元
贡献
1836 点
发表于 2021-2-4 16:00:58 | 显示全部楼层
这个代码就是错的,根本不能运行,那你怎么对比的时间呢。
[Fortran] 纯文本查看 复制代码
MODULE mod
REAL,DIMENSION(:,:,:),ALLOCATABLE :: indt,ce
ENDMODULE mod

PROGRAM ceshi
USE mod
IMPLICIT NONE
integer maxx,maxy,maxz
real dzz
dzz=0.6
maxz=80;maxy=80;maxx=80
allocate(indt(maxx,maxy,maxz),ce(maxx,maxy,maxz))
indt=0;ce=0
indt(:39,:,:)=1
ce(:39,:,:)=dzz

ENDPROGRAM ceshi

7

帖子

4

主题

0

精华

入门

F 币
45 元
贡献
27 点
 楼主| 发表于 2021-2-4 17:35:43 | 显示全部楼层
li913 发表于 2021-2-4 15:51
计算量太小,讨论效率没有意义。程序启动时间占比太大。

已经更改了。

7

帖子

4

主题

0

精华

入门

F 币
45 元
贡献
27 点
 楼主| 发表于 2021-2-4 17:36:19 | 显示全部楼层
li913 发表于 2021-2-4 16:00
这个代码就是错的,根本不能运行,那你怎么对比的时间呢。[mw_shl_code=fortran,true]MODULE mod
REAL,DIME ...

我已经重新更改了

97

帖子

2

主题

0

精华

大师

F 币
762 元
贡献
374 点

规矩勋章

发表于 2021-2-6 06:23:42 | 显示全部楼层
其一,多重循环在优化编译后,一般会变成单重循环的机器语言。建义关闭优化参数,重新编译,看看有无区别。
其二,尽量多用Fortran的Array功能, 如上面给出例子中的数组赋值,或者数组Where语句等。少用循环。

7

帖子

4

主题

0

精华

入门

F 币
45 元
贡献
27 点
 楼主| 发表于 2021-2-6 09:54:18 | 显示全部楼层
风平老涡 发表于 2021-2-6 06:23
其一,多重循环在优化编译后,一般会变成单重循环的机器语言。建义关闭优化参数,重新编译,看看有无区别。 ...

已经尝试过,没用
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2021-3-6 07:19

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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