Отсутствует функция из вывода 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 вызов.

2 ответа

Решение

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

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

Если вам нужен отчет о профиле, отличный от того, который может предоставить gprof, вам могут пригодиться инструменты повышения производительности Google (aka 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
Другие вопросы по тегам