Я пишу модуль ядра для специальной камеры, работающий через V4L2 для обработки переноса кадров в код пользовательского пространства. Затем я делаю много пользовательского пространства в приложении.
Время здесь очень важно, поэтому я много профилирую производительность std::chrono::steady_clock
что-то для отслеживания времени, но я дошел до того, что мне нужно также собрать данные о времени со стороны ядра, чтобы я мог проанализировать весь путь от аппаратного прерывания через V4L DQBuf до пространства пользователя …
Кто-нибудь может порекомендовать хороший способ получения данных синхронизации высокого разрешения, которые будут соответствовать данным пользовательского пространства приложения, которые я мог бы использовать для таких сравнений? Прямо сейчас я измеряю активность в микросекундах ..
Ubuntu 12.04 LTS
На самом низком уровне находятся rdtsc
а также rdtscp
инструкции, если вы используете процессор x86 / x86-64. Это должно обеспечить минимальные издержки, максимально возможное разрешение на границе ядра / пространства пользователя.
тем не мение, Есть вещи, о которых нужно беспокоиться. Вы должны убедиться, что вы выполняете на одном ядре / процессоре, процесс не переключается из контекста и частота не меняется при каждом вызове. Если процессор поддерживает инвариант TSC, (constant_tsc
в /proc/cpuinfo
это немного более надежно для процессоров / ядер и частот.
Это должно обеспечить примерно наносекундную точность.
Существует множество утилит уровня ядра, которые могут получить трассировки, связанные с синхронизацией. Например, ptrace
, ftrace
, LTTng
, Kprobes
, Проверьте эту ссылку для получения дополнительной информации.
http://elinux.org/Kernel_Trace_Systems