这是我的简单fortran计划
program accel
implicit none
integer, dimension(5000) ::a,b,c
integer i
real t1,t2
do i=1,5000
a(i)=i+1
b(i)=i+2
end do
call cpu_time(t1)
do i=1,5000
c(i)=a(i)*b(i)
end do
call cpu_time(t2)
write (*,*)'Elapsed CPU time = ',t2-t1,'seconds'
end program accel
但是cpu时间显示0.0000秒。为什么?
答案 0 :(得分:1)
进行5000次乘法不需要很长时间 - 它可能只需要少于一个cpu_time()
分辨率的单位。曲目5000到100000左右,然后你可能会看到一些东西。
答案 1 :(得分:1)
优化器已经看到c永远不会被读取,因此可以跳过c的计算。 如果打印c的值,则不会优化循环。
答案 2 :(得分:1)
用此来显示答案:
write(*,'(A,F12.10,A)')'Elapsed CPU time = ',t2-t1,' seconds.'
根据@Ernest Friedman-Hill和@KlasLindbäck的回答,至少有两个理由可以归零:
在第一种情况下,您有几个选择:
您可以使用我上面给出的格式显示t2-t1
的更多数字,或者您可以在几毫秒内打印结果:1000*(t2-t1)
添加更多迭代:如果您执行50000次迭代而不是5000次,则需要花费十倍的时间。
使每次迭代更长:您可以使用数学函数替换一系列复杂操作的乘法
在第二种情况下,你可以:
通过将适当的标志传递给编译器来禁用优化(-O0
用于gfortran)
在循环
c
醇>
我在OS X Lion上使用gfortran 4.2.1编译了你的程序,它开箱即用(以指数表示法显示时间),格式化(简答题)也正常。我尝试启用和禁用优化,它也运行良好。
cpu_time
的准确性可能与平台有关,因此也可以解释不同机器的不同行为,但是所有这些都可以解决您的问题。