除了迭代一个大的虚拟数组之外,C++中是否有一种快速使处理器的L2缓存失效的方法?
我假设这是为了性能测试,您想要消除运行之间的缓存效应。
在这种情况下,您需要知道以下信息才能有效地执行此操作:
然后,基本上就是触摸内存,距离每个其他的allocation_size
字节,直到完全刷新缓存。
上下文切换也经常使缓存无效 - 等待一毫秒可能会更快,如果操作系统将您换入和换出,则很可能会清除缓存。
另一个可能的解决方案是确保每次运行对缓存内容敏感的东西时,使用完全不同的内存部分。然后,这些内存位将不会在缓存中,有效地刷新了缓存。
当然,这对指令缓存来说可能不是一个很容易管理的解决方案,只适用于数据缓存,即使如此,处理堆栈也会很棘手。
我想不出这种方法可靠地适用于TLB缓存,如果您关心的话。
这种方法的另一个问题是可能仍然存在脏缓存行,代码的后续运行将产生将它们刷新到主存储器的成本。
你想在VC++中使用内存栅栏:
void SThreadUtil::synchronizeCache()
{
_mm_mfence();
}
抱歉,刷新应该使用_mm_clflush