在ubuntu 14.04机器上,我运行的是C ++代码,它在某些部分是并行的(我使用ICC编译,-fopenmp选项并使用#pragma指令)。
我需要精确测量两种情况:
1)第一次,让我们说T1,这是代码只进行非并行操作所花费的时间。
2)第二次T2对应于T1加上进一步操作OPS所花费的时间(可以并行化或不并行化)。
我使用以下秒表类测量T1和T2:
#include <time.h>
#include <sys/times.h>
#include <iostream>
struct stopwatch
{
clock_t tstart;
clock_t tprevlap;
clock_t tlap;
tms ustart;
tms uprevlap;
tms ulap;
unsigned int clk_tk;
stopwatch() :
tstart(clock()), // clock()
tprevlap(tstart),
tlap(tstart),
ustart(),
uprevlap(),
ulap(),
clk_tk(sysconf(_SC_CLK_TCK))
{
times(&ustart);
std::copy(&ustart, &ustart + 1, &uprevlap);
std::copy(&ustart, &ustart + 1, &ulap);
};
void lap()
{
std::copy(&ulap, &ulap + 1, &uprevlap);
tprevlap = tlap;
times(&ulap);
tlap = clock();
}
double partial_wall_time()
{
return ((double)tlap-tstart)/CLOCKS_PER_SEC;
}
double lap_wall_time()
{
return ((double)(tlap-tprevlap))/CLOCKS_PER_SEC;
}
double partial_user_time()
{
return ((double)ulap.tms_utime-ustart.tms_utime)/clk_tk;
}
double lap_user_time()
{
return ((double)(ulap.tms_utime-uprevlap.tms_utime))/clk_tk;
}
double partial_sys_time()
{
return ((double)ulap.tms_stime-ustart.tms_stime)/clk_tk;
}
double lap_sys_time()
{
return ((double)ulap.tms_stime-uprevlap.tms_stime)/clk_tk;
}
};
如果我评论#pragma指令(即并行实现),T1和T2都是正确测量的,而如果我以并行的方式实现它们,使用秒表打印的日志中报告的时间是错误的,并且很多大于有效时间。 我对计算确切的T2不太感兴趣(操作OPS时花费的时间并不重要),但至少T1必须正确测量。 我想这是因为如果实现是并行的,clock()函数会测量我机器的4个核心(线程)所花费的时间。那么,我应该使用哪个其他功能和库?
谢谢!