Время вычислений в linux: гранулярность и точность

********************** Оригинальное название **********************


Я использую разные типы часов, чтобы получить время в системах LINUX:

rdtsc, gettimeofday, clock_gettime

и уже прочитали различные потоки, подобные этим:

Какое лучшее временное разрешение я могу получить в Linux

Как достигается микросекундное время получения linux gettimeofday() и какова его точность?

Как измерить временной интервал в C?

более быстрый эквивалент gettimeofday

Гранулярность во времени

Почему clock_gettime настолько неустойчив?

Но я немного смущен:


В чем разница между детализацией, разрешением, точностью, точностью?


Гранулярность (или разрешение или точность) и точность - это не то же самое (если я прав...)

Например, при использовании "clock_gettime" точность составляет 10 мс, когда я получаю:

struct timespec res;
clock_getres( CLOCK_REALTIME, &res):

и гранулярность (которая определяется как тики в секунду) составляет 100 Гц (или 10 мс), как я получаю при выполнении:

 long ticks_per_sec = sysconf(_SC_CLK_TCK); 

Точность находится в наносекундах, как указано выше:

struct timespec gettime_now;

clock_gettime (CLOCK_REALTIME, & gettime_now); time_difference = gettime_now.tv_nsec - start_time;

В приведенной ниже ссылке я увидел, что это глобальное определение детализации Linux и лучше не изменять его:

http://wwwagss.informatik.uni-kl.de/Projekte/Squirrel/da/node5.html#fig:clock:hw

Итак, мой вопрос: если это замечание выше было правильным, а также:

a) Можем ли мы увидеть, что такое гранулярность rdtsc и gettimeofday (с помощью команды)?

b) Можем ли мы изменить их (каким-либо образом)?

Заранее спасибо


********************** Изменить no2 **********************

Привет всем, я проверил несколько новых часов, и мне понравится поделиться информацией:

a) На приведенной ниже странице David Terei появилась прекрасная программа, которая сравнивает различные часы и их характеристики:

https://github.com/dterei/Scraps/tree/master/c/time

b) Я также тестировал omp_get_wtime как Raxman, предложенный мной, и я нашел точность в nsec, но не очень лучше, чем "clock_gettime" (как это было на этом сайте ):

http://msdn.microsoft.com/en-us/library/t3282fe5.aspx

Я думаю, что это функция времени, ориентированная на окно

Лучшие результаты даются с clock_gettime с помощью CLOCK_MONOTONIC, чем при использовании CLOCK_REALTIME. Это нормально, потому что первый вычисляет время ОБРАБОТКА, а другое РЕАЛЬНОЕ ВРЕМЯ соответственно

c) Я нашел также функцию Intel ippGetCpuClocks, но я не тестировал ее, потому что она обязательна для регистрации первой:

http://software.intel.com/en-us/articles/ipp-downloads-registration-and-licensing/

... или вы можете использовать пробную версию

Спасибо всем за ваши ответы!!!


Ответ 1

  • Точность - это количество информации, то есть количество значимых цифр, которые вы сообщаете. (Например, я 2 м, 1,8 м, 1,83 м, 1,8322 м. Все эти измерения являются точными, но все более точными.)

  • Точность - это отношение между сообщенной информацией и правдой. (Например, "Я высотой 1,70 м" более точен, чем "1,8 м", но на самом деле не является точным.)

  • Гранулярность или разрешение являются наименьшим временным интервалом, который может измерять таймер. Например, если у вас есть гранулярность 1 мс, то небольшая точка, сообщающая результат с точностью до наносекунды, поскольку она не может быть точной с таким уровнем точности.

В Linux доступные таймеры с повышенной степенью детализации:

  • clock() от <time.h> (разрешение 20 мс или 10 мс?)

  • gettimeofday() из Posix <sys/time.h> (микросекунды)

  • clock_gettime() на Posix (наносекунды?)

В С++ заголовок <chrono> предлагает некоторую абстракцию вокруг этого, а std::high_resolution_clock пытается дать вам наилучшие часы.