2013-08-07 68 views
2

我讀到了C++中關於緩存優化的內容以及現代CPU用於預測下一步需要什麼數據的機制,並將其複製到緩存中。但是,對於程序員來說,C++中有沒有直接的方法,他們知道接下來需要什麼,以確定哪些數據被複制到CPU緩存中?我可以控制在C++中複製到CPU緩存中的內容嗎?

+1

_access_將被複制到緩存中。現在,調整會做一點,valgrind cachegrind來完成剩下的工作。 (沒有,沒有直接的控制,即使有,沒有理智的操作系統會暴露:)) – sehe

+2

@sehe有處理器顯式控制;想起AltiVec。您可以定義一個輸入流,作爲預取器的強大粘性提示。但是如果OP沒有提及他的編程的話,最好不要進入這個。 – Potatoswatter

回答

6

這與您使用的處理器和編譯器有所不同。

假設您使用的是Intel x86/x64或兼容(例如AMD)處理器,處理器會提供大量預取指令,大多數編譯器都包含內核來調用它們。使用VC++,您可以使用_m_prefetch_m_prefetchw。有了gcc,你可以使用__builtin_prefetch。同樣,ARM上的VC++提供了一個__prefetch內在的用於同一目的(不,我真的不知道他們爲什麼不能使用與x86上相同的名稱;簽名和效果看起來完全相同)。

大多數其他合理的現代,高端的處理器可能提供類似的指令,並 我猜大多數編譯器提供內在函數來使它們可用,就像這些,內部函數的名稱會有所不同。對於這個問題,儘管這些函數是編譯器固有的,但大多數需要包含一些頭來使用它們 - 頭的名稱也會有所不同。

1

Jerry提供的預取內在函數可以做到這一點。請記住,該函數的參數控制了多種風格,確定哪些級別的緩存(如果有)將用於保留該行。例如prefetch_NTA不會污染高速緩存,而是提供僅供立即使用的線路(並且在您要立即使用並且只使用一次的情況下使用)

另外請記住,這些說明基本上是對CPU(它本身也很好地猜測要預取哪些行)。因此,他們是而不是保證工作,他們可能在許多情況下失敗(如果內存子系統被加載,或地址交換出內存)。

相關問題