|  | 
 
| 本帖最后由 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零柒玖玖(企鹅)
 
 
 | 
 |