2010-01-21 74 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缓存工作,如果你关心的话。

这种方法存在的另一个问题是,可能仍然存在脏的缓存行,稍后的代码运行会导致将它们刷新到主内存的成本。