Подтвердить что ты не робот

Что означает frame_dummy в контексте профилирования?

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

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

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

4b9b3361

Ответ 1

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

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

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

Здесь источник для frame_dummy в crtbegin.c - по моему чтению кода его следует вызвать только один раз.

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

Ответ 2

Я столкнулся с той же проблемой, вот мой вывод из 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

То есть, gprof принял f4 за frame_dummy.