Saya mencoba membuat profil beberapa kode C tetapi salah satu fungsi yang paling mahal secara intuitif tidak muncul di keluaran 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...
}
Mudah-mudahan kode semu itu bisa menjelaskan pengaturannya. haloSwap()
melibatkan banyak komunikasi antar thread dan menurut saya ini adalah bagian algoritma yang mahal. Ini dipanggil selama inisialisasi dan kemudian berulang kali selama perulangan algoritma.
GProf hanya menampilkan 1 panggilan ke haloSwap
(selama init), meskipun saya tahu panggilan itu dipanggil 1000+ kali dari dalam propagate()
.
propagate()
ditampilkan sebagai bagian kode yang paling mahal, tetapi saya ingin tahu apakah itu loop xyz atau komunikasi MPI.
Adakah yang tahu mengapa panggilan ke haloSwap
dari propagate
tampaknya diabaikan baik dalam jumlah panggilan maupun waktu yang dihabiskan dalam fungsi tersebut?
haloSwap
didefinisikan dalam file .c lain, yang mungkin menjadi faktornya?
Jika saya memindahkan panggilan haloSwap
ke loop utama setelah memanggil propagate
(bukan di dalamnya), GProf masih hanya menampilkan 1 panggilan ke sana.
propagate()
akhirnya dimasukkan. Beritahu kompiler Anda untuk tidak memasukkan fungsi. Misalnya, dengan GCC opsinya adalah-fno-inline
. - person Hristo Iliev   schedule 19.08.2016