fortran计划中的错误

时间:2012-02-29 14:13:53

标签: fortran90

这是我的简单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秒。为什么?

3 个答案:

答案 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的回答,至少有两个理由可以归零:

  1. 计算时间小于0.00005秒
  2. 编译器优化掉整个循环
  3. 在第一种情况下,您有几个选择:

    1. 您可以使用我上面给出的格式显示t2-t1的更多数字,或者您可以在几毫秒内打印结果:1000*(t2-t1)

    2. 添加更多迭代:如果您执行50000次迭代而不是5000次,则需要花费十倍的时间。

    3. 使每次迭代更长:您可以使用数学函数替换一系列复杂操作的乘法

    4. 在第二种情况下,你可以:

      1. 通过将适当的标志传递给编译器来禁用优化(-O0用于gfortran)

      2. 在循环

      3. 后的程序中的某个地方使用c

        我在OS X Lion上使用gfortran 4.2.1编译了你的程序,它开箱即用(以指数表示法显示时间),格式化(简答题)也正常。我尝试启用和禁用优化,它也运行良好。

        cpu_time的准确性可能与平台有关,因此也可以解释不同机器的不同行为,但是所有这些都可以解决您的问题。