【问题标题】:Time Calculation on parallel programs并行程序的时间计算
【发布时间】:2016-09-02 06:27:33
【问题描述】:

为了计算 c 程序花费的总时间,我们通常使用头文件 <time.h> 中的 clock()time() 函数。
clock() 测量 CPU 已使用的滴答数 (CLOCKS_PER_SEC),之后我们可以轻松地将我们希望计算的代码 sn-p 的起点和终点之间的差异除以 CLOCKS_PER_SEC。这有助于我们在秒内获得时间
同样time(null) 返回自特定时间点以来的整秒数。转介here

现在这是我的问题。为了计算使用 OpenMP 运行的普通 c 程序所花费的总时间(记录加速操作),我利用了系统中存在的所有处理器,计算所用时间的最佳方法是什么。由于 clock() 只会返回在每个处理器上运行程序所花费的累积时间,基本上

(actual_time_taken x omp_get_max_threads())

而 time() 是一种非常模糊的计算方法,就像我一样对以毫秒为单位的时间计算感兴趣。

【问题讨论】:

  • 恕我直言,这是stackoverflow.com/questions/12392278/… 的副本。如果可以的话,我的个人建议是clock_gettime(CLOCK_MONOTONIC_RAW ...。不幸的是,没有灵丹妙药——它总是在时钟质量和便携性,当然还有要求之间进行权衡。
  • 我没有看到任何避免 omp_get_wtime 的理由。如果您的操作系统导致计时器质量存在特定问题,这应该是一个合理的解决方案。例如,在 Windows 上,它可能基于 queryperformance API。

标签: c performance datetime time openmp


【解决方案1】:

由于您使用 C 进行编程,因此您应该使用函数 getrusage()。这将告诉您整个进程及其子进程、当前进程单独或所有线程的系统和用户模式时间。开始调用一次,结束调用一次,然后取差。

【讨论】:

  • 恐怕这个答案在很多层面上都是错误的:1)TICKS_PER_SEC 与 CPU 频率无关。它是一个标题#define,所以它不可能指的是频率。因此clock 不可能直接使用时间戳计数器 (TSC)。 2) 现代 CPU 有constant TSC,因此尽管频率缩放,您仍可以使用 TSC。
  • 这似乎是一个简单的误称,CLOCKS_PER_SEC 在现代 CPU 上被定义为 1M,可以使用从 clock() 读取的双精度值的差异来确定秒的操作。
  • @Zulan:好的,我已经删除了答案的那一部分,留下了我很确定仍然是好建议的部分。 :) 谢谢。
  • 对不起,这个建议是错误的。 getrusage() 正在返回 CPU 时间。对于加速测量,您需要经过(挂钟)时间。使用 omp_get_wtime() 的建议很好。
  • 感谢您的所有回复。我正在使用 cpu Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz 开发 Linux OS (ubuntu 14.04)。 omp_get_wtime() 以秒为单位返回时间,难道没有以毫秒为单位的函数吗?
【解决方案2】:

OpenMP 提供了omp_get_wtime() 来实现这一点。有什么理由不在你的代码中使用这个函数吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 2022-01-21
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多