实时计算运行时差异

时间:2013-11-20 11:21:53

标签: c time openmp

我遇到了以下问题:我必须测量程序需要执行的时间。该程序的标量版本可以正常使用下面的代码,但是当使用OpenMP时,它可以在我的PC上运行,但不能在我应该使用的资源上运行。 事实上:

  • 标量计划rt 34s
  • openmp program rt 9s

那是我的电脑(一切正常) - 用visual studio编译 我必须使用的资源(我认为Linux,用gcc编译):

  • 标量计划rt 9s
  • openmp program rt 9s(但文本后面立即弹出,所以应该是0-1s)

我的观点是,它会添加所有刻度,大约相同的数量,并将它们除以单个核心的刻度率。我的问题是如何解决这个问题,如果有更好的方法可以在控制台上观看时间。

      clock_t start, stop;
double t = 0.0;
        assert((start = clock()) != -1);
      ... code running
        t = (double)(stop - start) / CLOCKS_PER_SEC;
printf("Run time: %f\n", t);

3 个答案:

答案 0 :(得分:4)

增加Mark的答案:不要使用clock()

clock()是旧计算机时代的一个可怕的误解,他的实际实现在平台之间差异很大。看哪:

    Linux上的
  • ,* BSD,Darwin(OS X) - 以及可能的其他4.3BSD后代 - clock()返回调用进程使用的处理器时间(不是挂钟时间!),即每个线程处理器时间的总和;
  • on IRIX,AIX,Solaris - 以及可能的其他SysV后代 - clock()返回调用进程使用的处理器时间(又不是挂钟时间)及其所有已终止的子进程{已执行{1}},waitsystem;
  • HP-UX似乎甚至没有实现pclose;
  • Windows上的
  • clock()返回挂钟时间(不是处理器时间)。

在上面的描述中,处理器时间通常表示用户和系统时间的总和。这可能小于挂钟(实际)时间,例如,如果进程休眠或等待文件IO或网络传输,或者它可能超过挂钟时间,例如当进程有多个线程时,主动使用CPU。

永远不要使用clock()。使用clock() - 它存在于OpenMP支持的所有平台上,并始终返回挂钟时间。

答案 1 :(得分:3)

将我之前的评论转换为为声誉做任何事情的精神答案......

使用对omp_get_wtime的两次调用来获取代码中两点之间的挂钟时间(以秒为单位)。请注意,在每个线程上单独测量时间,线程之间没有时钟同步。

答案 2 :(得分:0)

您的问题是clock。根据C标准,它测量CPU为您的过程传递的时间,而不是挂钟时间。所以这就是linux所做的(通常他们坚持标准)然后顺序程序或并行程序的总CPU时间是相同的,应该是这样。

Windows操作系统与此不同,因为clock是挂钟时间。

因此请使用其他时间测量功能。对于标准C,这将是time或者如果您需要使用新的C11标准更精确,您可以使用timespec_get,对于OpenMP,还有其他可能性已经提到过。