2009-07-12 108 views
2

我想在我的代碼中計算幾個cpu指令。例如我想知道有多少次增加,多少次乘法,多少次浮點操作,我的代碼執行多少次分支。我目前在Linux下使用gprof來分析我的C++代碼,但它只給出我函數的調用次數,並且我手動估計了指令的數量。有沒有什麼工具可以爲我做詭計?也許有些虛擬機?性能分析說明

回答

2

您可以使用ValgrindCallgrind--dump-instr=yes標誌來實現這個

+0

不直接計算指令,但有助於以非常方便的方式瀏覽程序集。謝謝。 – 2009-07-14 12:23:30

5

如果您確實需要計算指令,那麼您最好生成彙編程序,然後將輸出傳遞給智能grep等效項。對於gcc,請嘗試使用-S開關。

0

只是出於好奇,是指令計數來分析代碼性能的有效途徑?我知道,在「簡單」CPU設計的日子裏,你可以合理地假設每一個操作碼都需要超過CPU的時間才能執行,但是現在有了所有複雜的內存緩存方案,即時操作碼重新排序,流水線化,超標量體系結構以及其他所有現有CPU的投入,操作碼執行的簡單計數仍然能夠很好地指示代碼運行需要多長時間?或者,根據(例如)內存訪問模式和操作碼執行的順序,執行時間會有所不同,因爲它將按照操作碼執行的原始頻率執行?

我懷疑目前唯一能可靠地預測代碼性能的方法是實際運行目標架構上的代碼和時間......即通常當編譯器似乎發出低效的代碼時,它實際上巧妙地利用現代CPU架構的微妙特性。

+0

的確,現在有更多的變數,準確的預測很難。還有很多因素可能比指令數更重要。儘管如此,某些關係是真實的,並且對於可預見的未來仍然如成本(增加)<=成本(乘法)<=成本(除)<=成本(平方根)。用乘法替代鴻溝不太可能會損害性能並可能有所幫助。 – 2009-07-12 19:50:48

+0

你的表現是正確的。但是我的目標不是優化我的代碼的性能,而是進行其他類型的分析(指令類型和頻率)。 – 2009-07-14 11:51:42

1

英特爾vtune是免費的Linux用戶,AFAIK(假設我們正在談論一個基於英特爾的x86 linux機器)。它會給你所有你需要的信息和SOOO更多。

+1

就像編譯器一樣,Vtune作爲一個「評估版」只能免費使用30天。它被列爲699美元。相當「遠離」自由。 – greyfade 2009-07-12 19:01:43

4

這是一般性建議,不是Linux特定的:您應該對CPU週期感興趣。忘記指令的數量作爲衡量性能的指標。一條指令的成本可能與其他10條指令相同,所以它不會告訴你任何東西。

你應該關注CPU週期,並且在線程進入睡眠(「切換/退出」)的時間內,多線程環境中(即使不是全部也是如此),這會讓你知道多少時間等待I/O,數據庫等完成,並影響CPU的特權時間。

0

您可以使用pin-instat這是一個PIN工具。要使用它,您需要安裝PIN碼。但是,單憑指令數並不能說明性能。 Cache miss,分支預測也扮演重要角色。

聲明:我是pin-instat的作者。