Вопрос по profiling, g++, c++ – Что означает frame_dummy в контексте профилирования?

11

В процессе использования gprof для профилирования программы на C ++, которую я написал, я заметил, что подавляющее большинство времени выполнения тратится в функции frame_dummy. Точнее, первая запись в плоском профиле из вывода gprof показывает 76,38% времени выборки и 24611191 вызовов функции с именем frame_dummy.

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

Хотя это вряд ли уместно, я должен добавить, что эта программа предназначена для решения уравнения Пуассона с использованием многосеточного алгоритма и использует MPI для распараллеливания задачи. Однако, хотя присутствуют вызовы функций MPI, упомянутый выше вывод gprof выводится из запуска только одного процесса. Я также должен отметить, что моя программа не имеет никаких зависимостей, кроме MPI, и была скомпилирована с g ++ 4.6.1.

Это часть библиотеки времени выполнения C. Barmar

Ваш Ответ

2   ответа
8

Здесь очень хорошее объяснение:http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html , Но я не уверен, почему ваша программа будет проводить так много времени в frame_dummy или почему она будет вызываться так много раз.

Возможно, информация отладки в вашем бинарном файле каким-то образом повреждена или неправильно воспринимается gprof? Или gprof может быть запутан MPI? Вот что можно попробовать: запустить вашу программу в gdb и с точкой останова в функции frame_dummy. Посмотрите, действительно ли он вызывается 24 миллиона раз, и если да, то откуда он вызывается.

Кроме того, можете ли вы подтвердить, что это frame_dummy в crtbegin.o, а не какой-то другой frame_dummy?

Здесь & APOS; sисточник для frame_dummy в crtbegin.c - после прочтения кода он вызывается только один раз.

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

Спасибо за отличный ответ! В конечном итоге я обнаружил то же явление, что упоминал Джоэл; Компиляция с -O3 выполняет некоторую оптимизацию, которая заставляет gprof читать несколько часто вызываемых функций как вызовы frame_dummy. Ben
У меня была похожая проблема сегодня. Обновление с g ++ 4.4 до g ++ 4.6 представило некоторыеframe_dummy время. Похоже, что более новая версия g ++ выполняет другую / более агрессивную оптимизацию, когда действует -O3. Я не заметил этой проблемы с v4.4. После переключения на-Os Я заметил несколько функций, в которых были некоторые утверждения. Когда я удалил утверждения, эти функции стали намного быстрее и не способствовалиframe_dummy.
Для меня,gprof был сбит с толку моим использованием-fopenmp, если я удалил OpenMP,frame_dummy исчез.
Спасибо за ссылки!
Эдвард, как gprof находит имя функции? Может быть, Джон не добавлен-pg возможность составления собственной программы; но добавил это к шагу связывания.crtbegin с-pg использовался; но никаких вызовов инструментальной панели gprof в его коде.
4

Я столкнулся с той же проблемой, вот мой вывод из gprof:

  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 52.00     16.27    16.27   204000     0.08     0.08  frame_dummy
 47.46     31.12    14.85   418000     0.04     0.07  f2
  0.51     31.28     0.16    21800     0.01     1.42  f1
  0.03     31.29     0.01     1980     0.01    14.21  f5

В моем случае это было решено, когда я скомпилировалgcc -Os вместоgcc -O3:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls  ms/call  ms/call  name
 53.12     22.24    22.24   200000     0.11     0.11  f4
 45.65     41.36    19.11   598000     0.03     0.03  f2
  0.69     41.65     0.29    20000     0.01     1.45  f3
  0.45     41.84     0.19    39800     0.00     0.32  f1
  0.10     41.88     0.04                             evaluate

То есть гпроф ошибсяf4 заframe_dummy.

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

Похожие вопросы