35

我正在运行 .cpp 代码 (i) 以顺序样式和 (ii) 使用 OpenMP 语句。我正在尝试查看时差。为了计算时间,我使用这个:

#include <time.h>
.....
main()
{

  clock_t start, finish;
  start = clock();
  .
  .
  .
  finish = clock();

  processing time = (double(finish-start)/CLOCKS_PER_SEC);

 }

时间在代码的顺序(以上)运行中非常准确。运行它大约需要 8 秒。当我在代码中插入 OpenMP 语句并计算时间时,我会减少时间,但在控制台上显示的时间约为 8-9 秒,而实际上它只是实时的 3-4 秒!

这是我的代码的抽象外观:

#include <time.h>
.....
main()
{

  clock_t start, finish;
  start = clock();
  .
  .
  #pragma omp parallel for
  for( ... )
     for( ... )
       for (...)
    {           
      ...;      
    }
  .
  .
  finish = clock();

  processing time = (double(finish-start)/CLOCKS_PER_SEC);

 }

当我运行上面的代码时,我得到了时间的减少,但显示的时间在实时方面并不准确。在我看来,clock () 函数似乎正在计算每个线程的单独时间并将它们加起来并显示它们。

有人可以告诉我这样做的原因或建议我使用任何其他计时功能来测量 OpenMP 程序中的时间吗?

谢谢。

4

5 回答 5

51

在我看来,clock () 函数似乎正在计算每个线程的单独时间并将它们加起来并显示它们。

正是它所做clock()的——它测量进程使用的 CPU 时间,至少在 Linux 和 Mac OS X 上,这意味着自启动以来进程中曾经存在的所有线程的累积 CPU 时间。

OpenMP 应用程序的实时时钟(又名挂钟)计时应使用高分辨率 OpenMP 计时器调用来完成,该调用omp_get_wtime()返回double自过去任意点以来的秒数值。它是一个可移植的功能,例如存在于 Unix 和 Windows OpenMP 运行时中,与gettimeofday()仅 Unix 不同。

于 2012-06-03T22:20:23.217 回答
21

我见过 clock() 报告 CPU 时间,而不是实时。

你可以使用

struct timeval start, end;
gettimeofday(&start, NULL);

// benchmark code

gettimeofday(&end, NULL);

delta = ((end.tv_sec  - start.tv_sec) * 1000000u + 
         end.tv_usec - start.tv_usec) / 1.e6;

改为计时

于 2012-06-03T22:21:30.233 回答
11

您可以使用 omp 库本身中的内置omp_get_wtime函数。以下是找出执行时间的示例代码片段。

#include <stdio.h>
#include <omp.h>

int main(){

    double itime, ftime, exec_time;
    itime = omp_get_wtime();

    // Required code for which execution time needs to be computed
    
    ftime = omp_get_wtime();
    exec_time = ftime - itime;
    printf("\n\nTime taken is %f", exec_time);

}
于 2020-08-27T17:32:05.410 回答
6

嗯,是的,这clock()就是应该做的,告诉你程序使用了多少处理器时间。

如果要查找经过的实时时间,而不是 CPU 时间,请使用返回挂钟时间的函数,例如gettimeofday().

于 2012-06-03T22:20:13.013 回答
2
#include "ctime"

std::time_t start, end;
long delta = 0;
start = std::time(NULL);

// do your code here

end = std::time(NULL);
delta = end - start;

// output delta
于 2013-12-09T14:06:18.077 回答