Как найти время выполнения (если это возможно в наносекундах) разделов в коде C на Linux с двухъядерным процессором Intel? - PullRequest
2 голосов
/ 23 декабря 2009

У меня есть код на C с некоторыми функциями. Мне нужно выяснить время выполнения каждой функции, я пытался использовать gettimeofday и rdtsc, но я предполагаю, что, поскольку в его многоядерной системе время вывода соответствует времени переключения между процессоры. Я хотел, чтобы это было сериализовано. Так что, если кто-то может дать мне представление о том, как мне вычислить время или хотя бы сообщить мне о синтаксисе rdstcp.

P.S. пожалуйста ответь как можно скорее Спасибо:)

Ответы [ 8 ]

3 голосов
/ 23 декабря 2009

Немного непрактично ожидать наносекундного разрешения.

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

На практике измерения такого типа производятся путем наблюдения тактовых сигналов ЦП на осциллографе (или логическом анализаторе).

2 голосов
/ 23 декабря 2009

Если у вас несколько ядер, то таймер ЦП не будет стабильным между ними. Так что установите привязку потока , чтобы сохранить его на одном ядре. Вы также можете использовать таймер реального времени для измерения времени для процесса или потока, используя clock_gettime(CLOCK_PROCESS_CPUTIMER_ID). Прочтите примечание для систем SMP по использованию этой функции.

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

1 голос
/ 23 декабря 2009

Вы можете загрузить двухъядерную систему, чтобы использовать одно ядро, используя только следующий параметр ядра:

maxcpus=1

Но измеренное время все равно будет включать переключение между процессами и, таким образом, зависеть от активности других процессов в системе. Вас интересует время выполнения или время процессора, необходимое для выполнения вашей задачи?

1 голос
/ 23 декабря 2009

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

В Windows есть системный вызов SetThreadAffinity, я думаю, что в linux есть похожая функция, хотя я не знаю, как она называется.

0 голосов
/ 19 февраля 2014

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

struct timespec start, end;
clock_gettime(CLOCK_REALTIME,&start);
/* Do something */
clock_gettime(CLOCK_REALTIME,&end);

Возвращает значение как ((((unsigned64)start.tv_sec) * ((unsigned64)(1000000000L))) + ((unsigned64)(start.tv_nsec))))

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

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

0 голосов
/ 23 декабря 2009

Точное измерение производительности было невозможно до ядра Linux 2.6.31. В этом ядре была добавлена ​​новая библиотека для доступа к счетчикам производительности CPU и времени коррекции IMHO в планировщике.

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

0 голосов
/ 23 декабря 2009

Pavium правильный, единственный способ получить приличное время при этом разрешении с помощью осциллографа и переключения выводов GPIO.
Имейте в виду, что все это немного академично: я полагаю, что вы работаете с операционной системой и т. Д., Так что нет никакой возможности напрямую поработать с оборудованием.

Вам действительно нужно посмотреть причину, по которой вы хотите это измерение. Это тест производительности для некоторого кода? Вы можете попробовать запустить код много тысяч раз и получить статистику. Для такого подхода я бы рекомендовал вам прочитать Диатриб Зеда Шоу , чтобы убедиться, что цифры вас не обманывают.

0 голосов
/ 23 декабря 2009

Mate, я не уверен в этом, но даже если ты двухъядерный, если программа не является многопоточной, она будет работать только в 1 потоке (имеется в виду 1 ядро), поэтому она не должна включать время переключения между процессорами, я полагаю, такого не бывает ...

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