【发布时间】:2023-03-30 10:27:02
【问题描述】:
剧透:测试程序没有对结果做任何事情,所以循环的内容被优化编译器删除了,因此每次运行都需要大约相同的时间......无论如何,如果有人(我?)犯了同样的错误(再次......),我会让问题和答案保留下来。
原帖: 我想测试计算平方根与简单加法相比要慢多少,并编写了下面的小程序。我得到的结果是它需要大约相同的时间,在这种情况下为 0.3 秒。这是怎么回事?
program sqtest
implicit none
real r, s
integer i,j,n, sq, t
sq=11
n=100000000
r=1.11
if (sq==1) then
do i = 1,n
s = sqrt(float(i)*r)
enddo
write(*,*) "squareroot"
else
do j = 1,n
t = j+4
enddo
write(*,*) "plus"
endif
end program
输入sq=1 以使用平方根。平方根循环也进行了从int 到float 的乘法和转换。
【问题讨论】:
-
是的,可能是这样。如果我写入文件需要更长的时间,但是 i/o 可能会受到限制。我想我必须通过测试做出更多的思考。我使用 gfortran,我的笔记本电脑和操作系统是 64 位的,如果是 ram,则为 8gb。我不知道你的问题的确切答案。
-
当您进行此类测试时,您应该检查程序集(例如使用
objdump -d)以确保编译器生成了您期望的代码。在这种情况下,我相信编译器删除了 do 循环,因为没有使用结果。您最终应该执行s = s+sqrt(float(i)*r)并在循环后打印该值以避免删除代码。此外,从 int 到 float 的转换很昂贵,您可能应该使用i_float = 0. ; do i=1,n ; i_float = i_float + 1. ; ...来避免转换。
标签: fortran square-root