Callgrind медленно с выключенными инструментами - PullRequest
8 голосов
/ 27 января 2012

Я использую callgrind для профилирования многопоточного приложения linux, и в основном он работает отлично. Я запускаю его с выключенным инструментарием ( - instr-atstart = no ), а затем, как только настройка завершена, я включаю его с помощью callgrind_control -i on . Однако, когда я изменяю определенные конфигурации, чтобы попытаться профилировать другую часть приложения, он начинает работать очень медленно, даже до того, как я включаю инструментарий. По сути, часть кода, которая при нормальной работе занимает несколько секунд, занимает более часа с callgrind (инструментарий выключен). Любые идеи относительно того, почему это может быть и как отладить / устранить медлительность?

1 Ответ

10 голосов
/ 09 февраля 2012

Callgrind - это инструмент, построенный на valgrind. Valgrind - это в основном динамический бинарный переводчик (libVEX, часть valgrind). Он будет декодировать каждую инструкцию и JIT-компилировать их в поток некоторых команд того же процессора.

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

Инструменты построены на valgrind путем добавления некоторого кода инструментария. Инструмент "Nul" (nulgrind) - это инструмент, который не добавляет инструментов. Но каждый инструмент использует valgrind, и динамический перевод активен все время. Включение и выключение в callgrind - это просто включение и выключение дополнительных инструментов.

Виртуальный ЦП, реализованный Valgrind, ограничен, имеется (неполный) список ограничений http://valgrind.org/docs/manual/manual-core.html#manual-core.limits Большинство ограничений касаются операций с плавающей запятой, и их можно эмулировать неправильно.

Связано ли изменение с операциями с плавающей запятой? Или с другими перечисленными ограничениями?

Также вы должны знать, что " Valgrind сериализует выполнение так, что одновременно работает только один поток ". (с той же страницы manual-core.html)

...