快速使缓存失效 在C++中,除了重复大型伪数组外,还有没有办法快速地使处理器的L2缓存失效? < P>我假设这是性能测试,并且希望消除运行之间的缓存效应。

快速使缓存失效 在C++中,除了重复大型伪数组外,还有没有办法快速地使处理器的L2缓存失效? < P>我假设这是性能测试,并且希望消除运行之间的缓存效应。,c++,caching,C++,Caching,在这种情况下,您需要知道的是如何高效地执行此操作: 二级缓存的分配大小 二级缓存中有多少个分配 然后,基本上就是将内存分配\u size字节彼此分开,直到完全刷新缓存为止 上下文切换通常也会使缓存失效-等待一毫秒可能会更快,如果操作系统将您换入和换出,它可能会最终清除缓存。您想使用内存围栏。在vc++中: void SThreadUtil::synchronizeCache() { _mm_mfence(); } 对不起。对于刷新,它应该是\u mm\u clflush另一个可能的答案

在这种情况下,您需要知道的是如何高效地执行此操作:

  • 二级缓存的分配大小
  • 二级缓存中有多少个分配
  • 然后,基本上就是将内存
    分配\u size
    字节彼此分开,直到完全刷新缓存为止


    上下文切换通常也会使缓存失效-等待一毫秒可能会更快,如果操作系统将您换入和换出,它可能会最终清除缓存。

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

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

    对不起。对于刷新,它应该是
    \u mm\u clflush

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

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

    如果您关心的话,我也想不出一种方法可以让这种方法在TLB缓存中可靠地工作


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

    为什么需要这样做?这是一种可移植的方法。很可能有一种方法可以逃到集合中,并在那里实现。有些处理器甚至可能只有一条指令可以执行此操作。这是用于运行长度约为50纳秒的非常高分辨率计时,这就是为什么我想使用最快的方法。如果可以进入内核模式,可以发出WBINVD,这将导致刷新所有内部缓存。请注意,该指令是在缓存很小的时候设计的,因此需要(相对)较长的时间才能完成,一般不建议这样做。(请参阅)我将此答案作为最后一条注释,因为通过缓存线进行迭代是我以前已经在做的事情。您确定这会使缓存无效吗?内存围栏不只是保证内存操作在到主内存的总线上被看到时之间的顺序吗?\u mm\u cflush需要一个参数,因此OP必须猜测缓存中哪些东西可能会干扰,然后确保将它们全部刷新。看起来\u mm\u clflush一次只刷新一条缓存线-