Я пытаюсь профилировать некоторый код 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 вызов.
propagate()
оказывается встроенным. Скажите своему компилятору не встраивать функции. Например, для GCC параметр равен-fno-inline
. - person Hristo Iliev   schedule 19.08.2016