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