簡體   English   中英

我怎么知道我的數組在緩存中?

[英]How can i know my array is in cache?

可以說我的數組是32KB,L1是64 KB。 Windows在程序運行時是否使用了部分內容? 也許我無法使用L1,因為Windows正在使其他程序工作? 我應該將程序的優先級設置為使用所有緩存嗎?

for(int i=0;i<8192;i++)
{
  array_3[i]+=clock()*(rand()%256);//clock() and rand in cache too?
  //how many times do I need to use a variable to make it stay in cache?
  //or cache is only for reading? look below plz
  temp_a+=array_x[i]*my_function();
}

該程序使用C / C ++。

對於L2也一樣。

還有功能保存在緩存中嗎? 緩存是只讀的嗎? (如果我更改了我的數組,那么它會丟失緩存綁定?)

編譯器是否創建asm代碼以使用緩存更高的產量?

謝謝

我怎么知道我的數組在緩存中?

一般來說,你不能。 一般來說,緩存由硬件直接管理,而不是由Windows管理。 您也無法控制數據是否駐留在緩存中(盡管可以指定不應緩存內存區域)。

在程序運行時,Windows是否使用了部分內容? 也許我無法使用L1,因為Windows正在使其他程序工作? 我應該將程序的優先級設置為使用所有緩存嗎?

L1和L2高速緩存由在給定核心上運行的所有進程共享。 當您的進程正在運行時,它將使用所有緩存(如果需要)。 當有上下文切換時,部分或全部高速緩存將被逐出,具體取決於第二個進程需要什么。 因此,下次上下文切換回您的進程時,可能必須重新填充緩存。

但同樣,這一切都是由硬件自動完成的。

功能還保存在緩存中?

在大多數現代處理器上,有一個單獨的緩存用於指令。 請參閱此圖 ,其中顯示了Intel Nehalem架構的布局; 注意共享的L2和L3高速緩存,但是單獨的L1高速緩存用於指令和數據。

緩存是只讀的?(如果我更改我的數組然后它失去了緩存綁定?)

否。緩存可以處理修改后的數據,雖然這要復雜得多(因為在多核系統中同步多個緩存的問題 。)

編譯器是否創建了asm代碼以使用緩存更多的收益?

由於緩存活動通常全部由硬件自動處理,因此不需要特殊指令。

  • 緩存不是由操作系統直接控制,而是在硬件中完成

  • 在上下文切換的情況下,另一個應用程序可能會修改緩存,但您不應該關心這一點。 處理程序對緩存不友好的情況更為重要。

  • 函數保存在緩存中(I-Cahce,指令緩存)

  • 緩存不是只讀的,當你寫入內存和緩存時。

據我所知,你無法控制緩存中的內容。 您可以將變量聲明為register var_type a ,然后對它的訪問將在單個循環(或少量循環)中。 此外,訪問大塊內存所需的周期數也取決於虛擬內存轉換和TLB。 應該注意的是,register關鍵字僅僅是一個建議,編譯器可以完全自由地忽略它,正如評論所建議的那樣。

緩存主要由硬件控制。 但是,我知道Windows調度程序傾向於將線程的執行安排到與之前相同的核心,因為緩存。 它理解有必要將它們重新加載到另一個核心上。 Windows至少從Windows 2000開始使用此行為。

正如其他人所說,你通常無法控制緩存中的內容。 如果您正在編寫高性能代碼並且需要依賴緩存來提高性能,那么編寫代碼並使用大約一半的L1緩存空間並不罕見。 這樣做的方法涉及超出StackOverflow問題范圍的大量討論。 從本質上講,您希望在轉移到其他數據之前對某些數據執行盡可能多的工作。

實際上,使用大約一半的高速緩存留下足夠的空間來發生其他事情,大多數數據將保留在高速緩存中。 如果沒有來自操作系統和計算平台的其他方面的合作,您不能依賴於此,因此它可能是加速研究計算的有用技術,但它不能用於必須保證實時性能的地方,如操作危險機械。

除了您使用的數據量之外,還有其他警告。 使用映射到相同緩存行的數據可以從緩存中逐出數據,即使有大量緩存未使用。 矩陣轉置因此而臭名昭着,因為行長度為2的中等冪的倍數的矩陣將具有列,其中元素映射到一小組緩存行。 因此,學習有效地使用緩存是一項重要工作。

即使你可能不知道哪些數據在緩存中,哪些數據不在緩存中,你仍然可以知道你正在使用多少緩存。 現代處理器有很多性能計數器,其中一些與緩存有關。 英特爾的處理器可能會告訴您有多少L1和L2未命中。 檢查這一點以獲取更多有關如何操作的詳細信息: 如何讀取i5,i7 CPU上的性能計數器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM