快速使缓存无效

时间:2010-01-21 01:01:35

标签: c++ caching

在c ++中是否有办法快速使处理器的L2缓存无效,而不是迭代一个大的假数组?

3 个答案:

答案 0 :(得分:1)

我将假设这是用于性能测试,并且您希望在运行之间消除缓存效果。

在这种情况下,您需要知道的有效做法是:

  1. L2缓存的分配大小
  2. L2缓存中有多少分配
  3. 然后,基本上是在完全刷新缓存之前,将内存allocation_size字节相互接触的问题。

    上下文切换通常也会使缓存失效 - 它可能会更快到wait一毫秒,如果操作系统交换进出,它可能最终会清除缓存。

答案 1 :(得分:1)

另一个可能的答案是确保每次运行对缓存内容敏感的内容时都使用完全不同的内存部分。那么这些内存中没有一个会在缓存中,有效地,缓存将被刷新。

当然,对于指令缓存而言,这可能不是一个非常容易管理的解决方案,仅适用于数据缓存,即使这样处理堆栈也会很棘手。

如果您关心TLB缓存,我无法想到这种方法可靠地为TLB缓存工作的方法。

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

答案 2 :(得分:-2)

您想使用内存栅栏。在vc ++中:

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

对不起。对于刷新,它应该是_mm_clflush