我正在尝试优化一些fortran代码,并注意到了一些我想理解的惊人行为。 progb的运行速度比proga快3到4倍。唯一的区别是progb中的赋值是“ d = 2”,而不是proga中的赋值是“ d = b”,因此天真的这些应该等效:
program proga
implicit none
call hist(2)
stop
end
subroutine hist(b)
implicit none
integer,intent(in):: b
integer d,i,p(200000000)
d = b
do i=1,200000000
p(i) = i/d
end do
write(*,*) p(1)
end
program progb
implicit none
call hist(2)
stop
end
subroutine hist(b)
implicit none
integer,p(200000000)
d = 2
do i=1,*) p(1)
end
我用“ gfortran proga.f -O3”进行编译,对于progb同样如此。在Debian的gcc版本4.9.2以及cygwin的gcc版本5.4.0上都会发生这种情况。
当我在不使用-O3标志的情况下进行编译时,两者都以相同的速度运行,因此听起来编译器也无法优化proga。在proga上无法完成哪些优化,为什么?
对于这篇文章,我已经删节了代码(我的实际代码做了一些有用的事情!)。常量200000000应该足够大以提供足够的运行时间。该写操作可以防止循环被优化。