c++ - 测量 C++ OpenMP 代码中的执行时间

标签 c++ time parallel-processing openmp

我正在 (i) 以顺序方式运行 .cpp 代码并 (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 程序中的时间吗?

谢谢。

最佳答案

It seems to me as though the clock () function is calculating each thread's individual time and adding up them up and displaying them.

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

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

关于c++ - 测量 C++ OpenMP 代码中的执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39949431/

相关文章:

c++ - 可排序的 std::initializer_list

c - 使用 GNU clock() 处理处理器计时溢出

haskell - list-to-tree 函数的渐近运行时

python - Python定义二维数组的耗时

java - 核心计数任务 CompletableFuture 比 parallelStream 慢

java - java是如何处理多线程的?线程多于进程

c++ - Threadsafe OpenSSL 在单线程中的使用?

c++ - 在自定义迭代器上应用 reverse_iterator 后引用失效

c++ - 回溯命名空间

stored-procedures - 有没有办法并行执行雪花中的存储过程