【问题标题】:OpenMP time and clock() give two different resultsOpenMP time 和 clock() 给出两个不同的结果
【发布时间】: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.

【问题讨论】:

    标签: c openmp


    【解决方案1】:

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

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

    【讨论】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2013-06-01
        • 2017-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多