使用秒表,时钟()和openmp时测量时间错误

时间:2016-02-15 17:07:02

标签: c++ multithreading parallel-processing openmp stopwatch

在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个核心(线程)所花费的时间。那么,我应该使用哪个其他功能和库?

谢谢!

0 个答案:

没有答案