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