2013-11-26 57 views
1

當你調試性能關鍵代碼,看着拆卸,這不是太難以發現由於數據高速緩存未命中的瓶頸:什麼是非數據緩存未命中的跡象(指令,TLB等)?

  1. 加載/存儲指令往往是平時的瓶頸,這意味着如果您停止該程序,則可能會停止接近從某個不可預知的內存地址加載的加載/存儲指令。

  2. 同樣,找到分支預測失誤的一種方法是觀察並查看是否破壞程序通常會將其停止在特定跳轉附近,然後查看代碼以查看跳轉是否可預測。

(或者,至少,這是怎麼試圖找到這樣的瓶頸。如果我找錯了症狀讓我知道..)

什麼,然而,症狀其他種類的緩存未命中?
知道他們是罕見的,但我仍然想知道如何/當他們出現時發現他們。

「其他」的緩存,我的意思是一樣的東西:

  1. 指令緩存(S)
  2. 轉換後備緩衝器
  3. 的,我應該知道,但我不是其他重要緩存獎勵積分意識到
+2

這些符號是您在探查器輸出中看到的數字。可以讀取處理器實現的性能計數器的任何像樣的分析器支持。請避免列表問題,只是谷歌「英特爾處理器性能計數器」。 –

+1

@HansPassant:好點,但是當我沒有適合當前語言的分析器時,有沒有辦法做到這一點?我之前提到的數據緩存的症狀不需要分析器 - 它們只是需要隨機暫停程序幾次。它們並不總是需要反彙編器 - 通過查看源代碼中的當前行,使用任何語言,都不難看出由於指針加載或難以預測的分支造成的可能瓶頸。我們可以爲其他類型的瓶頸做同樣的事嗎? – Mehrdad

+1

這些計數器與語言無關,它們嚴格遵守機器代碼執行。當然這是普遍的。試圖從「暫停程序幾次」收集配置文件信息完全沒有意義,這只是浪費時間。使用適當的工具。 –

回答

1

啊,好老的窮人探測器技術。如果我說我不時使用它,我會說謊,但這確實是有問題,可能會偏向於找到heisenbugs,並不一定反映真實的行爲。另一個問題是指令在現代無序CPU上是重疊的,所以即使程序需要更長的時間來執行一些加載或存儲操作,實際中斷點也可能遠離它(在長時間延遲加載指令實際發生之前很久提交,或長期存儲指令做了。

有了這樣說,如果你堅持使用它,你可以

  1. 檢查頁面中斷裂點附近的加載/存儲地址偏移( 4k/2M/..取決於您的系統配置)訪問流內的小偏移量可能表示TLB未命中,而走查程序使用LBR檢查最後的分支行爲vior和可預見性

不能想辦法來識別我緩存未命中,因爲這些都是甚至更早,並進一步從執行流水線在您的調試器可能趕上「當前」指令脫鉤

+0

Ahh#1是一個很好的觀點。儘管沒有專門的工具,#2可能有點困難。 +1 – Mehrdad

相關問題