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)