Неправильное измерение времени при использовании секундомера, часов () и openmp

На машине с 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

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]