Можно ли использовать vtune для определенных фрагментов кода в двоичном коде, а не во всем двоичном?
Я добавляю использование небольшой библиотеки к большому существующему программному обеспечению и хотел бы проанализировать (более детально, чем просто вызовы & rdtsc() или gettimeofday) накладные расходы и их атрибуцию небольшой библиотеки. Используя такие вещи, как rdtsc(), я могу почувствовать задержку, которая возникает при вызове функций моих библиотек, но я не могу выполнить атрибуцию задержки, если не смогу также определить, хорошо ли предсказываются ветви, не работает ли кэширование должным образом и т. Д. Я смотрел на PAPI, когда представлял себе, что некоторые аппаратные события входят и выходят из подпрограммы в моей библиотеке в контексте большего двоичного файла, но, похоже, мне понадобится специальный модуль ядра, чтобы PAPI работал на меня (Linux 2.6.18 && Intel Xeon 5570)... есть Vtune, специально предназначенный для процессоров Intel, но кажется, что это то, что будет профилировать весь двоичный файл для производительности, а не конкретные фрагменты кода (3-4 вызова в мою библиотеку).
Есть ли способ для меня использовать Vtune для моей цели, или, возможно, что-то, что может дать мне доступ к таким счетчикам без необходимости исправления моего ядра?
2 ответа
Невозможно определить точку входа в vtune для начала записи.
Однако, что вы можете сделать, это запустить трассировку без записи, а затем, когда вы ожидаете попадания в свою библиотеку, вы запускаете трассировку и позволяете ей записывать вызовы. После вызовов вы можете остановить его снова и теперь можете посмотреть вызов библиотеки, используя верхнюю-нижнюю вкладку в vtune.
С его помощью вы сможете увидеть всю информацию, касающуюся звонков, и времени, проведенного в каждом.
Если вы хотите быть уверены, что вы отслеживаете только тогда, когда вызовы активны, вы можете запустить приложение под GDB и вставить точки останова при доступе к функциям, которые вы хотите проверить, и оставить их, а затем соответствующим образом запустить и остановить профилировщик.
Матиас прав: вы можете запустить профилирование с паузой ("Начать с паузы" в VTune-говорить), а затем в своей программе использовать API __itt_pause / __itt_resume из VTune API, чтобы ограничить сбор данных областью кода, представляющей интерес.
Вы также можете установить "Тип продолжительности цели" на "Менее одной минуты" в свойствах проекта - это сделает выборку более мелкозернистой (10 кГц вместо частоты по умолчанию 1 кГц). Или вручную настройте значение Sample After в списке событий для сбора. Последнее часто более полезно, когда вы хотите профилировать что-то конкретное, например, непредсказуемые ветви.