2009-11-12 32 views
8

我需要提高系統的吞吐量。如何使用cachegrind輸出來優化應用程序

通常的優化循環已經完成,我們已經實現了1.5倍的更好的吞吐量。

我現在開始懷疑我是否可以利用cachegrind輸出來提高系統的吞吐量。

有人可以指點我如何開始呢?

我的理解是我們需要確保最常用的數據應該保持足夠小,以便它保留在L1緩存中,並且下一組數據應該適合L2。

這是我正在採取的正確方向嗎?

回答

6

確實cachegrind輸出本身並沒有提供太多的信息如何去優化代碼。一個人需要知道如何解釋它,並且你對數據擬合成L1和L2所說的話確實是正確的方向。爲了全面瞭解內存訪問模式如何影響性能,我推薦閱讀GNU libc維護者Ulrich Drepper撰寫的優秀論文"What Every Programmer Should Know About Memory"

+0

謝謝Kaustaurya,這確實是一篇很好的文章。 我記得前面通過這篇文章,但我能夠更好地欣賞這個時代的內閣。 – rajeshnair 2009-11-13 14:23:24

2

根據the Cachegrind documentation,cachegrind給您的詳細信息是您的代碼的給定部分的緩存未命中數。您需要了解高速緩存如何在您的目標架構上工作,以便您瞭解如何修復代碼。實際上,這意味着將數據縮小或更改某些數據的訪問模式,以便緩存的數據仍在緩存中。但是,您需要了解程序的數據和數據訪問權限,然後才能對信息採取行動。正如它在手冊中所述,

簡而言之,Cachegrind可以告訴你代碼中的一些瓶頸在哪裏,但它不能告訴你如何解決它們。你必須自己解決這個問題。但至少你有這些信息!

3

如果您在解析cachegrind輸出時遇到問題,請查看KCacheGrind(它應該在您的發行版中可用)。我使用它並發現它很有幫助。

2

1.5x是一個不錯的加速。這意味着你發現有33%的時間可以擺脫掉。我打賭你可以做更多的事情,甚至在你開始處理像數據緩存這樣的低級問題之前。 This is an example of how.基本上,你可能會有額外的性能問題(以及加速的機會),之前並不大,如25%所說。那麼,在1.5倍加速的情況下,這25%現在是37.5%,所以它比它「值得更多」。通常這樣的問題是以一些中間堆棧函數調用的形式請求工作,一旦你知道它需要多少成本,你可能認爲不是完全必要的。由於kcachegrind沒有真正指出這些,你可能沒有意識到這是一個問題。

+0

我大多數人都同意。但是,我不認爲緩存是一個低級問題。任何你可能瞄準的平臺都會有一個緩存(即使是現代的CUDA卡)。對緩存進行優化也可能會產生很大的改進,並且可以在不查看編譯器的彙編輸出的情況下完成。 – 2013-06-14 09:05:00

+0

@JørgenFogh:對。處理器開發人員已經盡其所能,優化處理時間。我們的軟件開發人員並不總是通過確保我們的代碼「精簡而有意義」來回報。我總是能看到它。 – 2013-06-14 13:13:31

+0

這絕對是真的。我的觀點是,一個好的處理器無法彌補效率低下的算法。這包括緩存性能較差的算法。緩存效率不能作爲事後補充。 – 2013-06-14 14:26:56