[英]Missing function from GProf output
我正在嘗試分析一些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壓縮。
有誰知道為什么從propagate
中調用haloSwap
的調用在調用次數和在函數中花費的時間都被忽略了?
haloSwap
是在另一個.c文件中定義的,這可能是一個因素嗎?
如果在調用propagate
(而不是在內部)之后haloSwap
的調用haloSwap
主循環,則GProf仍然僅顯示對其的1次調用。
@Hristo_Iliev和@Angelos是正確的,我正在優化中進行編譯,而我的問題通過使用-O0進行了解決。 愚蠢的錯誤,我敢肯定我以前做過。
啟用優化進行性能分析絕對不是愚蠢的錯誤。 相反,它是一個就應該剖析的方式-否則會浪費你的時間和精力手工優化程序編譯器可能已經為您解決。
如果您需要的個人資料報告與gprof提供的報告不同,則Google性能工具 (也稱為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.