Точная (или лучше) микросекундная синхронизация процесса в Linux - PullRequest
13 голосов
/ 08 октября 2008

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

Я отчетливо помню, как увидел патч ядра Linux, который позволил бы мне синхронизировать свои процессы с точностью до наносекунды, за исключением того, что я забыл добавить его в закладки и также забыл название патча: (.

Я помню, как это работает:

При каждом переключении контекста он считывает значение часов с высоким разрешением и добавляет дельту двух последних значений ко времени процесса запущенного процесса. Это дает точное разрешение фактического времени процесса с высоким разрешением.

Обычное время процесса поддерживается с использованием обычных часов, которые, я считаю, с точностью до миллисекунды (1000 Гц), что слишком велико для моих целей.

Кто-нибудь знает, о каком патче ядра я говорю? Я также помню, что это было как слово с буквой до или после него - что-то вроде 'rtimer' или что-то подобное, но я точно не помню.

(приветствуются и другие предложения)


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

  • times () возвращает значения 21, 22 в миллисекундах.
  • clock () возвращает значения 21000, 22000, такая же степень детализации.
  • getrusage () возвращает значения, такие как 210002, 22001 (и иногда), они выглядят немного более точными, но значения выглядят одинаково.

Итак, теперь у меня проблема, вероятно, в том, что в ядре есть нужная мне информация, я просто не знаю системный вызов, который ее вернет.

Ответы [ 8 ]

5 голосов
/ 30 декабря 2008

См. этот вопрос для получения дополнительной информации.

То, что я использовал для таких вещей, - это gettimeofday (). Это обеспечивает структуру с секундами и микросекундами. Звоните до кода и снова после. Затем просто вычтите две структуры с помощью timersub, и вы можете получить время, которое заняло в секундах, из поля tv_usec.

5 голосов
/ 30 декабря 2008

Если вы ищете этот уровень временного разрешения, вы, вероятно, пытаетесь провести некоторую микрооптимизацию. Если это так, вы должны посмотреть на PAPI . Он не только предоставляет информацию как о настенных часах, так и о виртуальной (только для процесса) синхронизации, он также предоставляет доступ к счетчикам событий процессора, которые могут быть незаменимы при попытке повысить производительность.

http://icl.cs.utk.edu/papi/

3 голосов
/ 08 октября 2008

Если вам нужны очень маленькие единицы времени для (я полагаю) тестирования скорости вашего программного обеспечения, я бы порекомендовал просто запустить части, которые вы хотите синхронизировать, в цикле миллионы раз, взять время до и после цикла и рассчитать среднее. Приятным побочным эффектом этого (помимо необходимости выяснить, как использовать наносекунды) является то, что вы получите более согласованные результаты, поскольку случайные издержки, вызванные планировщиком ОС, будут усреднены.

Конечно, если ваша программа не должна запускаться миллионы раз в секунду, возможно, это достаточно быстро, если вы не можете измерить время выполнения в миллисекундах.

1 голос
/ 30 декабря 2008

попробуйте счетчик отметок времени процессора ? Википедия предлагает использовать clock_gettime ().

1 голос
/ 19 ноября 2008

Кажется, я нашел патч для ядра, который искал. Разместив его здесь, я не забуду ссылку:

http://user.it.uu.se/~mikpe/linux/perfctr/ http://sourceforge.net/projects/perfctr/

Редактировать: это работает для моих целей, хотя и не очень удобно для пользователя.

1 голос
/ 08 октября 2008

http://allmybrain.com/2008/06/10/timing-cc-code-on-linux/

может вам помочь (напрямую, если вы делаете это на C / C ++, но я надеюсь, что он даст вам указатели, даже если вы этого не сделаете) ... Он утверждает, что обеспечивает микросекундную точность, которая просто передает ваш критерий. :)

1 голос
/ 08 октября 2008

Вы можете использовать высокоточный таймер событий ( HPET ), если у вас достаточно свежее ядро ​​2.6. Проверьте Documentation / hpet.txt о том, как его использовать. Это решение зависит от платформы, и я считаю, что оно доступно только на более новых системах x86. HPET имеет таймер не менее 10 МГц, поэтому он должен легко соответствовать вашим требованиям.

Я полагаю, что некоторые реализации PowerPC от Freescale также поддерживают счетчик команд с точным циклом. Я использовал это несколько лет назад для профилирования высоко оптимизированного кода, но я не могу вспомнить, как он называется. Я считаю, что у Freescale есть патч для ядра, который вы должны применить, чтобы получить к нему доступ из пространства пользователя.

1 голос
/ 08 октября 2008

Я считаю, что CFC ( Совершенно честный планировщик ) - это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...