OpenMP time 和 clock() 给出两个不同的结果

Posted

技术标签:

【中文标题】OpenMP time 和 clock() 给出两个不同的结果【英文标题】:OpenMP time and clock() give two different results 【发布时间】:2012-05-27 06:34:01 【问题描述】:

我有通过 OpenMP 并行化的顺序代码。我已经输入了相应的编译指示并对其进行了测试。我通过检查在 main 函数中花费的时间来衡量性能增益。

奇怪的是通过cpu_time()omp_get_wtime() 计算的经过时间是不同的。为什么?

根据cpu_time()的经过时间与顺序时间相似。

计算开始前:

ctime1_ = cpu_time();
#ifdef _OPENMP
ctime1 = omp_get_wtime();
#endif

计算结束后:

ctime2_ = cpu_time();
#ifdef _OPENMP
ctime2 = omp_get_wtime();
#endif

cpu_time() 函数定义:

double cpu_time(void)

  double value;
  value = (double) clock () / (double) CLOCKS_PER_SEC;
  return value;

打印结果:

printf("%f - %f seconds.\n", ctime2 - ctime1, ctime2_ - ctime1_);

示例结果:

7.009537 - 11.575277 seconds.

【问题讨论】:

【参考方案1】:

clock 函数测量 CPU 时间,即您在 CPU 上花费的时间,OMP 函数测量执行期间经过的时间,这是两个完全不同的东西。

您的进程似乎在某处等待时被阻塞了。

【讨论】:

在 Windows 上,clock() 实际上测量的是挂墙时间。 @Mysticial,再次,他们似乎遵循自己的心情,而不是标准。标准规定:clock 函数返回实现与程序使用的处理器时间的最佳近似值,因为该实现定义的时代开始时仅与程序调用相关。 @JensGustedt 听起来他们遵循标准。 实现的最佳近似似乎是墙上时间kek【参考方案2】:

您观察到的结果对于任何并行应用程序都是完全有效的 - clock() 返回的所有线程的组合 CPU 时间 通常超过 挂钟时间omp_get_wtime() 衡量,除非您的应用程序大部分时间处于休眠或等待状态。

【讨论】:

【参考方案3】:

clock() 函数返回 CPU 时间,而不是 wall 时间。请改用gettimeofday()

【讨论】:

以上是关于OpenMP time 和 clock() 给出两个不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ OpenMP 代码中测量执行时间

高分求助!!!!openMP并行效率问题

openmp的性能

openmp 并行编程探秘

time.time 和time.clock

C++编程,clock置换算法