2010-01-21 69 views
3

有沒有辦法在c + +快速使處理器的L2緩存失效,而不是迭代通過大的假數組?迅速使緩存無效

+0

爲什麼你需要那個? – 2010-01-21 01:05:03

回答

1

我打算假設這是用於性能測試,並且希望消除運行之間的緩存效應。

在這種情況下,你需要知道有效地做到這一點的是:

  1. L2高速緩存的分配大小
  2. 多少分配有L2緩存

然後,它基本上是一個觸摸內存allocation_size字節的問題,直到你完全刷新緩存。

上下文切換通常也會使緩存無效 - 在wait一毫秒內可能會更快,並且如果操作系統將您換入和換出,它可能會最終清除緩存。

+0

這是實現它的便攜式方式。有可能有一種方法可以逃脫裝配並使其在那裏發生。有些處理器甚至可能只有一條指令。 – Omnifarious 2010-01-21 01:09:02

+0

這是針對非常高分辨率的時序,運行長度約爲50納秒,這就是爲什麼我想使用最快的方法可能 – Mark 2010-01-21 01:12:17

+2

如果您可以進入內核模式,您可以發出WBINVD,這將導致所有內部緩存被刷新。請注意,它的指令是在緩存很小時設計的,因此需要花費相當長的時間才能完成,一般不推薦。 (請參閱http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-07/msg09421.html) – 2010-01-21 01:22:46

-2

你想使用內存圍欄。在vC++中:

void SThreadUtil::synchronizeCache() 
{ 
    _mm_mfence(); 
} 

對不起。沖洗它應該是_mm_clflush

+2

你確定會使緩存無效嗎?內存隔離不能保證在總線上的內存操作到主內存之間的順序? – Omnifarious 2010-01-21 01:10:40

+0

_mm_cflush雖然有一個參數,所以OP將不得不猜測緩存中可能會干擾什麼,然後確保將其全部清除。 – Omnifarious 2010-01-21 01:15:59

+0

看起來_mm_clflush一次只能刷新一條緩存行 - http://msdn.microsoft.com/en-us/library/ba08y07y.aspx – Mark 2010-01-21 01:19:06

1

另一個可能的答案是確保每次對緩存內容敏感的事情都運行時使用完全不同的內存部分。那麼這些內存中的任何一部分都不會進入緩存,並且實際上緩存將被刷新。

當然,這可能不是一個非常容易管理的指令緩存解決方案,只能用於數據緩存,即使如此,處理堆棧也會非常棘手。

我想不出一種方法可以可靠地爲TLB緩存工作,如果你關心的話。

這種方法存在的另一個問題是,可能仍然存在髒的緩存行,稍後的代碼運行會導致將它們刷新到主內存的成本。