避免在 Fortran DO 循环中使用 IF 语句
Avoid IF statements in a Fortran DO loops
在我的 Fortran 程序中,我有类似于这个 do 循环的东西
do i = 1,imax
if(period) then
call g_period()
else
call g()
endif
enddo
我有几个地方,有时在一个 do 循环中有几个 If 循环,它检查我是否应该调用函数 X 或 Y。所有这一切的共同点是输入文件中定义了句点,并且它没有改变在整个 运行 时间内。
有没有办法避免 if 语句——因为我的速度被所有检查的东西扼杀了?虽然,我想保持通用的为什么能够 运行 一次使用 period = true 和其他时间使用 period = false 的程序。
如果速度真的很重要,你总是可以写两个不同的版本。一个为真,一个为假:
if(period) then
do i = 1,imax
call g_period()
end do
else
do i = 1,imax
call g()
end do
end if
您甚至可以拥有完全独立的子程序和所有内容。
当您调用子例程时,g()
和备选方案会做大量工作,if 可能不会有太大的性能损失。但是,如果你做一些事情,比如遍历一个由许多点组成的大型 3D 数组,并在每个点上做一些数学运算,只有几个例外,那么在任何地方计算它并在之后为那些少数例外点撤消它甚至可能更快, 而不是在紧密循环中引入分支。
在我的 Fortran 程序中,我有类似于这个 do 循环的东西
do i = 1,imax
if(period) then
call g_period()
else
call g()
endif
enddo
我有几个地方,有时在一个 do 循环中有几个 If 循环,它检查我是否应该调用函数 X 或 Y。所有这一切的共同点是输入文件中定义了句点,并且它没有改变在整个 运行 时间内。 有没有办法避免 if 语句——因为我的速度被所有检查的东西扼杀了?虽然,我想保持通用的为什么能够 运行 一次使用 period = true 和其他时间使用 period = false 的程序。
如果速度真的很重要,你总是可以写两个不同的版本。一个为真,一个为假:
if(period) then
do i = 1,imax
call g_period()
end do
else
do i = 1,imax
call g()
end do
end if
您甚至可以拥有完全独立的子程序和所有内容。
当您调用子例程时,g()
和备选方案会做大量工作,if 可能不会有太大的性能损失。但是,如果你做一些事情,比如遍历一个由许多点组成的大型 3D 数组,并在每个点上做一些数学运算,只有几个例外,那么在任何地方计算它并在之后为那些少数例外点撤消它甚至可能更快, 而不是在紧密循环中引入分支。