用C ++ OpenMP代码测量执行时间

时间:2012-06-03 21:52:10

标签: c++ time parallel-processing openmp

我以顺序方式运行.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计划的时间吗?

感谢。

5 个答案:

答案 0 :(得分:35)

  

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

正好 clock()做什么 - 它测量进程使用的CPU时间,至少在Linux和Mac OS X上是指所有线程的累计CPU时间自从它开始以来就一直存在。

OpenMP应用程序的实时(也称为挂钟)时序应使用高分辨率OpenMP计时器调用omp_get_wtime()来完成,该调用返回自任意点以来的秒数的double值。过去。它是一种便携式功能,例如存在于Unix和Windows OpenMP运行时,与仅{Unix}的gettimeofday()不同。

答案 1 :(得分:17)

我见过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;

改为计时

答案 2 :(得分:5)

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

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

答案 3 :(得分:2)

您可以使用omp库本身的内置获取时间功能。这是代码

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

int main(){

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

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

}

答案 4 :(得分:0)

#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