写入后CPU缓存线何时刷新到内存?

时间:2013-02-22 16:16:21

标签: c# caching cpu-cache

我正在使用C#,并希望尽可能避免使用unsafe代码。如果我有一个大小足以填充缓存行的对象或数组,并且我想写入数组的对象或索引的每个字段,CPU是否会在刷新写入行之前等待所有写入操作或当只有一个或几个写入发生时,它会提前刷新吗?

如果我想只在所有写入行发生之后才发生刷新,那么我应该快速连续地在例程结束时执行所有写操作吗?我知道CPU和缓存一致性协议可能会有所不同,我正在寻找一个普遍真实的经验法则。

2 个答案:

答案 0 :(得分:2)

  

在刷新之前,CPU会等待所有写操作发生   写入行或当只发生一次或几次写入时它会提前刷新吗?

CPU可能会提前清空该行,但前提是该集合在高速缓存中属于其他访问权限。这不太可能。缓存的结构有助于避免过早刷新最近访问的数据。

  

我应该在例行程序结束时快速连续完成所有写入操作吗?

总的来说是的。 时间位置很重要,这意味着当访问按时间紧密分组时,缓存的性能最佳。其他技巧也可能适用。例如,你可以尝试温暖'通过在所需写入之前对结构进行虚拟写入来实现高速缓存行。这允许一些内存级并行性,其中核心加载高速缓存行,同时干预代码执行。当您执行实际写入时,可能会更好地在L1中准备好缓存行。

一般来说,要非常谨慎地对代码中的不自然行为进行改进,以提高缓存性能。缓存做得非常好,只留给自己。您应该始终在任何更改之前和之后测量性能。你认为可能是一种改进实际上可能会受到伤害。如果你的程序是多线程的,那么另外一大堆蠕虫会在核心之间发生缓存争用。

答案 1 :(得分:1)

当然,CPU会尝试尽可能少地进行内存访问,但这并不一定意味着“你的”内存块只要你愿意就会保存在缓存中。

通常情况下,内存块会被读取一次并写入一次,但不能保证。可能会发生中断代码的事情,系统可能会决定刷新该缓存行以为其他内容腾出空间。整个内存区域甚至可以从内存中完全删除并刷新到磁盘,这样当代码控制时会导致页面错误,从而再次加载内存。

让您的写入时间更接近当然会使内存更有可能在该操作期间保留在缓存中。