【问题标题】:Timing a Fortran multithreaded program为 Fortran 多线程程序计时
【发布时间】:2011-02-22 19:41:52
【问题描述】:

我有一个调用多线程例程的 Fortran 90 程序。我想从调用例程中计时这个程序。如果我使用cpu_time(),我最终会将所有线程(在我的情况下为 8 个)的 cpu_time 加在一起,而不是程序运行所需的实际时间。 etime() 例程似乎也是如此。关于如何为这个节目计时(不使用秒表)有什么想法吗?

【问题讨论】:

    标签: time fortran openmp performance-testing


    【解决方案1】:

    如果这是一次性的事情,那么我同意 larsmans 的观点,使用 gprof 或其他一些分析可能是要走的路;但我也同意非常在你的代码中使用更粗略的计时器来计时计算的不同阶段。您拥有的最佳时间信息是您实际使用的东西,而且很难击败在您运行代码的每个时间段都会输出的东西。

    Jeremia Wilcock 指出omp_get_wtime() 非常有用;它符合标准,因此可以在任何 OpenMP 编译器上运行 - 但它只有第二个分辨率,这可能不够,也可能不够,这取决于你在做什么已编辑;以上是完全错误的。

    Fortran90 定义了system_clock(),它也可以用于任何符合标准的编译器;该标准没有指定时间分辨率,但 gfortran 似乎是毫秒,而 ifort 似乎是微秒。我通常以这样的方式使用它:

    subroutine tick(t)
        integer, intent(OUT) :: t
    
        call system_clock(t)
    end subroutine tick
    
    ! returns time in seconds from now to time described by t
    real function tock(t)
        integer, intent(in) :: t
        integer :: now, clock_rate
    
        call system_clock(now,clock_rate)
    
        tock = real(now - t)/real(clock_rate)
    end function tock
    

    并使用它们:

    call tick(calc)
    ! do big calculation
    calctime = tock(calc)
    
    print *,'Timing summary'
    print *,'Calc: ', calctime
    

    【讨论】:

    • omp_get_wtime() 将秒作为双精度数返回,因此亚秒级分辨率当然是可能的。使用 GCC,如果平台支持高分辨率计时器,它可以提供纳秒级分辨率。
    • Wrt system_clock,对于 gfortran,您可以使用 integer(kind=8) 参数,在这种情况下,它提供纳秒(4.6,如果操作系统支持)或微秒(旧版本)分辨率。
    • @janneb -- 我的错误,你在 omp_get_wtime() 上是对的 -- 误读了文档。
    • 我建议使用system_clock()integer(int64) 以获得更高精度的计数器。
    • 也许给出与操作系统相关的答案是合理的,但是:Windows gfortran 上的 system_clock 使用 QueryPerformance API,gfortran 和 ifort 的 omp_get_wtime() 也是如此(仅限最新版本)。使用 ifort Windows,您甚至无法获得毫秒级的分辨率。
    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 2015-11-19
      • 2013-08-16
      • 2021-11-26
      • 2015-04-28
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多