2012-07-12 603 views
10

在使用gprof來剖析我編寫的C++程序的過程中,我注意到絕大多數執行時間都花在函數「frame_dummy」上。更準確地說,gprof的輸出中的平面配置文件中的第一個條目顯示調用名爲frame_dummy的函數中的樣本時間的76.38%和24611191調用。frame_dummy在分析的上下文中意味着什麼?

簡而言之,我試圖理解frame_dummy是指什麼 - 因爲我沒有任何名爲這樣的函數 - 以及這對我的優化工作意味着什麼。

雖然這不太可能是相關的,但我應該補充一點,該程序旨在使用多重網格算法解決泊松方程,並使用MPI來並行化任務。但是,儘管存在MPI函數調用,但上述gprof輸出僅源自運行一個進程。我還應該注意到我的程序除了MPI之外沒有任何依賴關係,並且用g ++ 4.6.1編譯。

+0

它是C運行時庫的一部分。 – Barmar 2012-12-27 05:49:28

回答

7

這裏有一個很好的解釋:http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html。但是我不確定你的程序爲什麼會在frame_dummy中花費那麼多時間,或者爲什麼它會被調用這麼多次。

也許您的二進制文件中的調試信息以某種方式損壞,或者被gprof誤讀?或者gprof可能會被MPI弄混嗎?這裏有一些可以嘗試的方法:在gdb中運行程序,並在frame_dummy函數中使用斷點。看看它是否真的被稱爲2400萬次,如果真的這樣做,那麼它會被調用。

另外,你能確認這是crtbegin.o中的frame_dummy,而不是其他一些frame_dummy嗎?

這是the source for frame_dummy in crtbegin.c - 通過閱讀代碼,應該只能調用一次。

此外,我假設你的程序運行併產生正確的結果? (特別是,如果有一個在你的程序中的內存錯誤,那麼你可以得到一些非常奇怪的行爲。)

+0

感謝您的鏈接! – 2012-12-28 10:20:57

+1

Edward,gprof如何找到一個函數名?可能是約翰沒有在自己的程序編譯中加入'-pg'選項;但將其添加到鏈接步驟。 ''crtbegin'使用'-pg';但在他的代碼中沒有調用gprof工具。 – osgx 2012-12-28 14:27:20

+0

非常感謝!我最終發現了喬爾提到的同樣的現象;使用-O3進行編譯會執行某種優化,導致gprof讀取幾個頻繁調用的函數,作爲對frame_dummy的調用。 – Ben 2013-04-16 23:13:47

4

我遇到了同樣的問題,這裏是從gprof的我的輸出:

% cumulative self    self  total 
time seconds seconds calls ms/call ms/call name 
52.00  16.27 16.27 204000  0.08  0.08 frame_dummy 
47.46  31.12 14.85 418000  0.04  0.07 f2 
    0.51  31.28  0.16 21800  0.01  1.42 f1 
    0.03  31.29  0.01  1980  0.01 14.21 f5 

在我的案例

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total 
time seconds seconds calls ms/call ms/call name 
53.12  22.24 22.24 200000  0.11  0.11 f4 
45.65  41.36 19.11 598000  0.03  0.03 f2 
    0.69  41.65  0.29 20000  0.01  1.45 f3 
    0.45  41.84  0.19 39800  0.00  0.32 f1 
    0.10  41.88  0.04        evaluate 

也就是說,gprof的誤認f4frame_dummy:當我編譯gcc -Os,而不是gcc -O3它得到了解決。

+0

這正是問題所在,儘管實際上好像有幾個不同的函數被frame_dummy包含。不過,這有點令人沮喪,因爲關閉優化會顯着改變配置文件結構,因爲函數會受到編譯器優化的不同程度的影響。 – Ben 2013-04-16 23:17:32