Отсутствует функция из вывода GProf

Я пытаюсь профилировать некоторый код C, но одна из наиболее интуитивно затратных функций не отображается в выводе GProf.

int main() {
    initialise...
    haloSwap();

    for(...) {
        functions...

        propagate();

        functions...
    }
}

void propagate() {
    for (x)
        for (y)
            for (z)
                grid[xNew][yNew][zNew] = grid[x][y][z];

    haloSwap();
}

void haloSwap() {
    // Horizontal swap
    create buffers...
    MPI_Sendrecv(buffers);
    recreate grid from buffers...

    // Vertical swap
    create buffers...
    MPI_Sendrecv(buffers);
    recreate grid from buffers...
}

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

GProf показывает только 1 вызов haloSwap (во время инициализации), хотя я знаю, что он вызывался более 1000 раз изнутри propagate().

propagate() отображается как самая дорогая часть кода, но я хотел бы знать, является ли это циклом (циклами) xyz или связью MPI.

Кто-нибудь знает, почему вызовы haloSwap из propagate, по-видимому, игнорируются как по количеству вызовов, так и по времени, проведенному в функции?

haloSwap определен в другом файле .c, что может быть фактором?

Если я перенесу вызов haloSwap в основной цикл после вызова propagate (а не внутри него), GProf все равно покажет только 1 вызов.


person Kallum Burgin    schedule 19.08.2016    source источник
comment
Вы, вероятно, компилируете с оптимизацией, и propagate() оказывается встроенным. Скажите своему компилятору не встраивать функции. Например, для GCC параметр равен -fno-inline.   -  person Hristo Iliev    schedule 19.08.2016
comment
добавить в комментарий @Hristo_Iliev. Обертка mpicc (из MPICH) использует оптимизацию -O2, которая включает флаг -finline-small-functions. Если есть функции, которые вы хотите исключить из какой-либо оптимизации, используйте атрибуты gcc для функций, например, void haloSwap() __attribute__(optimize(-O0))   -  person Angelos    schedule 19.08.2016
comment
Если вы используете MPI, то он выполняет ввод-вывод, а gprof, как известно, не замечает этого, поскольку выборка приостанавливается во время ввода-вывода. Вы можете тратить 99% времени на ввод-вывод, но gprof этого не покажет. То же самое относится ко всему, что называет себя профилировщиком ЦП.   -  person Mike Dunlavey    schedule 25.08.2016
comment
@MikeDunlavey Я полагаю, что способ бедняка понять это - проверить реальное прошедшее время по сравнению с временем процессора, указанным gprof?   -  person Kallum Burgin    schedule 26.08.2016
comment
@KallumBurgin: это покажет проблему. Некоторые люди используют этот метод, который работает в режиме реального времени, а не только с процессорным временем. Он менее точен в определении времени, но более точен в обнаружении проблем.   -  person Mike Dunlavey    schedule 26.08.2016


Ответы (2)


Профилирование с включенными оптимизациями — абсолютно не глупая ошибка. Наоборот, именно так следует профилировать — иначе вы потратите время и силы на ручную оптимизацию подпрограмм, которые компилятор мог бы исправить за вас.

Если вам нужен отчет о профиле, отличный от того, который может предоставить gprof, вам могут помочь инструменты производительности Google (также известные как gperftools). полезно для вас. Отчеты будут записывать время, проведенное во встроенной функции. Вот пример отчета, в котором вы можете увидеть, как инструменты Google сообщают о встроенных функциях:

% ~/soft/gperftools/bin/pprof --text \
    bigio_mpi bigio-profiling/prof-ca-fill-inline1-0.out| head -10
Using local file bigio_mpi.
Using local file bigio-profiling/prof-ca-fill-inline1-0.out.
Total: 29680 samples
10837  36.5%  36.5%    24056  81.1% ADIOI_P2PContigReadAggregation
3534  11.9%  48.4%     3534  11.9% _init@3a858
2954  10.0%  58.4%     2954  10.0% unshuffle_sse2
2448   8.2%  66.6%     2448   8.2% __memcpy_ssse3
1742   5.9%  72.5%     2661   9.0% type_create_contiguous_x (inline)
1373   4.6%  77.1%     1373   4.6% shuffle_sse2
1176   4.0%  81.1%     6205  20.9% ADIOI_Type_create_hindexed_x
1104   3.7%  84.8%    19082  64.3% ADIOI_Get_eof_offset
831   2.8%  87.6%    28184  95.0% ADIOI_Flatten
person Rob Latham    schedule 25.08.2016
comment
Мне нужна была информация о конкретной встроенной функции, которую я проигнорировал. - person Kallum Burgin; 26.08.2016

@Hristo_Iliev и @Angelos были правы, я компилировал с оптимизацией, и моя проблема была решена путем компиляции с -O0. Глупая ошибка, я уверен, что уже делал это раньше.

person Kallum Burgin    schedule 25.08.2016