12

我有通过 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.
4

3 回答 3

18

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

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

于 2012-05-20T13:26:25.467 回答
12

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

于 2012-05-20T16:00:22.070 回答
6

clock()函数返回CPU时间,而不是墙上时间。相反,使用gettimeofday().

于 2012-05-20T13:27:58.980 回答