Fungsi tidak ada dari keluaran GProf

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.


person Kallum Burgin    schedule 19.08.2016    source sumber
comment
Anda mungkin mengompilasi dengan optimasi dan propagate() akhirnya dimasukkan. Beritahu kompiler Anda untuk tidak memasukkan fungsi. Misalnya, dengan GCC opsinya adalah -fno-inline.   -  person Hristo Iliev    schedule 19.08.2016
comment
tambahkan ke komentar @Hristo_Iliev. mpicc (dari MPICH )wrapper menggunakan optimasi -O2 yang menyertakan flag -finline-small-functions . Jika ada fungsi yang ingin Anda kecualikan dari pengoptimalan apa pun, gunakan atribut gcc pada fungsi misalnya void haloSwap() __attribute__(optimize(-O0))   -  person Angelos    schedule 19.08.2016
comment
Jika Anda menggunakan MPI, maka ia melakukan I/O, dan gprof terkenal tidak mengetahui hal itu, karena pengambilan sampel ditangguhkan selama I/O. Anda mungkin menghabiskan 99% waktunya di I/O, tetapi gprof tidak akan menampilkannya. Hal yang sama berlaku untuk apa pun yang menyebut dirinya sebagai profiler CPU.   -  person Mike Dunlavey    schedule 25.08.2016
comment
@MikeDunlavey Saya kira cara orang malang untuk mendapatkan gambaran tentang hal itu adalah dengan memeriksa waktu berlalu yang sebenarnya versus waktu CPU yang dilaporkan gprof?   -  person Kallum Burgin    schedule 26.08.2016
comment
@KallumBurgin: Itu akan menunjukkan masalahnya. Beberapa orang menggunakan teknik ini yang bekerja pada waktu nyata, bukan hanya waktu CPU. Ini memiliki ketepatan waktu yang lebih rendah, tetapi lebih presisi dalam menemukan masalah.   -  person Mike Dunlavey    schedule 26.08.2016


Jawaban (2)


Pembuatan profil dengan pengoptimalan diaktifkan sama sekali bukan kesalahan bodoh. Ini adalah cara yang seharusnya profilkan -- jika tidak, Anda akan membuang-buang waktu dan tenaga untuk mengoptimalkan rutinitas yang dapat diperbaiki oleh kompiler untuk Anda.

Jika Anda memerlukan laporan profil yang berbeda dari yang disediakan gprof, alat kinerja Google (alias gperftools) mungkin bisa membantu Anda. berguna bagi Anda. Laporan akan mencatat waktu yang dihabiskan dalam fungsi inline. Berikut ini contoh laporan di mana Anda dapat melihat cara kerja sebaris laporan alat 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
Saya memerlukan informasi tentang fungsi tertentu yang sedang dimasukkan, yang telah saya abaikan. - person Kallum Burgin; 26.08.2016

@Hristo_Iliev dan @Angelos benar, saya mengkompilasi dengan optimasi dan masalah saya diselesaikan dengan mengkompilasi dengan -O0. Kesalahan bodoh, saya yakin saya pernah melakukannya sebelumnya.

person Kallum Burgin    schedule 25.08.2016