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

Measure execution time in C++ OpenMP code

本文关键字:测量 执行时间 C++ 代码 OpenMP      更新时间:2023-10-16

我正在运行一个.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);
 }

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

有人可以说出原因或建议我用于测量 OpenMP 程序中时间的任何其他计时函数吗?

谢谢。

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

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

OpenMP

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

我已经看到 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;

改为计时

您可以在 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("nnTime taken is %f", exec_time);
}

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

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

#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