有没有办法在c + +快速使处理器的L2缓存失效,而不是迭代通过大的假数组?迅速使缓存无效
迅速使缓存无效
回答
我打算假设这是用于性能测试,并且希望消除运行之间的缓存效应。
在这种情况下,你需要知道有效地做到这一点的是:
- L2高速缓存的分配大小
- 多少分配有L2缓存
然后,它基本上是一个触摸内存allocation_size
字节的问题,直到你完全刷新缓存。
上下文切换通常也会使缓存无效 - 在wait
一毫秒内可能会更快,并且如果操作系统将您换入和换出,它可能会最终清除缓存。
这是实现它的便携式方式。有可能有一种方法可以逃脱装配并使其在那里发生。有些处理器甚至可能只有一条指令。 – Omnifarious 2010-01-21 01:09:02
这是针对非常高分辨率的时序,运行长度约为50纳秒,这就是为什么我想使用最快的方法可能 – Mark 2010-01-21 01:12:17
如果您可以进入内核模式,您可以发出WBINVD,这将导致所有内部缓存被刷新。请注意,它的指令是在缓存很小时设计的,因此需要花费相当长的时间才能完成,一般不推荐。 (请参阅http://linux.derkeiler.com/Mailing-Lists/Kernel/2009-07/msg09421.html) – 2010-01-21 01:22:46
你想使用内存围栏。在vC++中:
void SThreadUtil::synchronizeCache()
{
_mm_mfence();
}
对不起。冲洗它应该是_mm_clflush
你确定会使缓存无效吗?内存隔离不能保证在总线上的内存操作到主内存之间的顺序? – Omnifarious 2010-01-21 01:10:40
_mm_cflush虽然有一个参数,所以OP将不得不猜测缓存中可能会干扰什么,然后确保将其全部清除。 – Omnifarious 2010-01-21 01:15:59
看起来_mm_clflush一次只能刷新一条缓存行 - http://msdn.microsoft.com/en-us/library/ba08y07y.aspx – Mark 2010-01-21 01:19:06
另一个可能的答案是确保每次对缓存内容敏感的事情都运行时使用完全不同的内存部分。那么这些内存中的任何一部分都不会进入缓存,并且实际上缓存将被刷新。
当然,这可能不是一个非常容易管理的指令缓存解决方案,只能用于数据缓存,即使如此,处理堆栈也会非常棘手。
我想不出一种方法可以可靠地为TLB缓存工作,如果你关心的话。
这种方法存在的另一个问题是,可能仍然存在脏的缓存行,稍后的代码运行会导致将它们刷新到主内存的成本。
- 1. 迅速为无
- 2. 使QLPreviewController“缓存”无效
- 3. 使nginx缓存无效
- 4. 无法在迅速
- 5. 无法以迅速
- 6. 无法在迅速
- 7. 无法在迅速
- 8. 无法在迅速
- 9. 迅速使动画效果永久
- 10. 使用迅速
- 11. 休眠:使第二级高速缓存无效
- 12. CachingCallHandler无法使缓存对象无效?
- 13. 使用在迅速
- 14. 使用AVAudioPlayer迅速
- 15. 使用presentviewcontroller迅速
- 16. nginx无缓冲区高速缓存
- 17. 无法使用类在迅速
- 18. 迅速
- 19. 迅速
- 20. 翠鸟Firebase存储缓慢显示图像 - 迅速3
- 21. jQuery.ajax - 强制高速缓存失效
- 22. 使毕加索的缓存无效
- 23. ASP.NET - 使浏览器缓存无效
- 24. 无效特定的缓存
- 25. Magento Enterprise - 无效缓存
- 26. 蟒范围方法等效于迅速
- 27. 循环迅速视频avplayer迅速
- 28. C程序中的CPU高速缓存无效?
- 29. 使用spring高速缓存的属性高速缓存
- 30. 迅速无效的定时器在功能
为什么你需要那个? – 2010-01-21 01:05:03