在C ++ 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程序中的时间?
谢谢。
我见过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;
改变时间
在我看来,clock()函数正在计算每个线程的单独时间并将其累加并显示出来。
这正是clock()
所做的 - 它测量进程使用的CPU时间,至少在Linux和Mac OS X上意味着自进程启动以来存在于进程中的所有线程的累积CPU时间。
OpenMP应用程序的实时时钟(又名挂钟)时序应使用高分辨率OpenMP定时器调用omp_get_wtime()
来完成,该omp_get_wtime()
返回自过去任意点以来秒数的double
值。 它是一个可移植的函数,例如存在于Unix和Windows OpenMP运行时,与gettimeofday()
不同,它只是Unix。
是的,这就是clock()
应该做的事情,告诉你程序使用了多少处理器时间。
如果您想查找实时时间,而不是CPU时间,请使用返回挂钟时间的函数,例如gettimeofday()
。