|
本帖最后由 sam295040799 于 2021-2-10 13:38 编辑
最近发现的一个问题,一直困扰我,看看没有大神给我解惑,有偿。
[Fortran] 纯文本查看 复制代码 04 | REAL , DIMENSION ( : , : , : ) , ALLOCATABLE , SAVE :: indt , ce , ce 1 , ce 2 |
19 | integer i , j , k , n , maxx , maxy , maxz , x 1 , x 2 , y 1 , y 2 , z 1 , z 2 |
24 | maxz = 80 ; maxy = 80 ; maxx = 80 |
25 | allocate ( indt ( maxx , maxy , maxz ) , ce ( 0 : maxx , 0 : maxy , 0 : maxz ) , ce 1 ( 0 : maxx , 0 : maxy , 0 : maxz ) , ce 2 ( 0 : maxx , 0 : maxy , 0 : maxz ) ) |
27 | x 1 = 10 ; x 2 = 30 y 1 = 10 ; y 2 = 40 |
34 | if ( i > x 1 .and. i < x 2 ) indt ( i , j , k ) = 1 |
35 | if ( j > y 1 .and. j < y 2 ) indt ( i , j , k ) = 1 |
36 | if ( k > z 1 .and. k < z 2 ) indt ( i , j , k ) = 1 |
49 | if ( indt ( i , j , k ) == 1 ) cycle |
50 | ce ( i , j , k ) = ce 1 ( i , j , k ) - ce 2 ( i , j -1 , k ) |
56 | print * , 'time' , time 2 - time 1 |
这段程序在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零柒玖玖(企鹅)
|
|