确定缓存是写回还是通过

时间:2012-10-05 04:26:23

标签: c++ caching profiling

如何通过测试写入来缓存缓存类型(回写/通过)?我可以使用类似的方法通过记录修改缓存的时间来确定缓存的级别和大小,但我需要与某些东西进行比较。例如。如果时间明显短于已知的L1写入缓存,我可以说它的写回。但是,我需要一根基线来比较,不是吗?

Heres my attempt at GitHub

主要思想是:

  • 如果通过,写x vs x * 100次的时间约为100次
  • 如果回写,时间会差不多吗?

所以WRITES_BASE次的循环时间与WRITES次的时间减去它们各自执行循环的时间(没有内存访问),并比较它们......这给了我一个印象我的Core i3 2100都通过缓存编写了......

16, 0.03, 1.04 (31.28) 
128, 0.07, 2.31 (31.78) 
2048, 0.10, 3.19 (31.74) 

以上值为:test size (KB), time for WRITES_BASE, time for WRITES (t(WRITES)/t(WRITES_BASE))

我猜测我的实验存在的问题是我没有消除我运行WRITES次的时差...

更新

我注意到一个奇怪的问题是如果我保留WRITES = 64 * WRITES_BASE,那么如果我有WRITES_BASE = 4 million

16, 0.01, 0.13 (17.16) 
128, 0.01, 0.29 (31.60) 
2048, 0.01, 0.41 (30.53) 

如果我增加WRITES_BASE = 16 million

16, 0.02, 0.52 (25.53) 
128, 0.04, 1.16 (31.74) 
2048, 0.05, 1.57 (31.89)

注意,当WRITES_BASE较小时,时间之间的差异较小,或许告诉我L1是写回缓存。但是,因为它并非总是如此,例如。当我增加WRITES_BASE时,我想知道我是否有一些逻辑错误?

1 个答案:

答案 0 :(得分:2)

使用此过程无法真正区分写回缓存和直写缓存。考虑一下:如果您正在使用写回缓存,则需要X时间来执行循环中的指令,并且Y时间将其写回。 Y不是由您的代码测量的(您没有显式缓存刷新或类似的任何时间)。当你循环N次时,它需要N * X时间,加上你的代码完成后执行以刷新缓存。

使用直写式缓存,X更高,Y为零。但是单循环与多循环的比例是相同的。因此,你无法区分这个程序。

也就是说,有一些方法可以检测到这一点。关键是在定时时强制缓存刷新其缓存行。尝试比较编写各种大小的数组所需的时间。在写入之间确保通过读取大量不相关的数据来刷新任何写回缓存(注意:不要只是分配大型数组并从中读取而不写入它 - 在程序启动时写入一次,然后读取整个事物在时间运行之间。否则,阵列中的所有页面可能指向物理内存中相同的归零页面,具体取决于您的操作系统。)

您还可以尝试查看何时编写大量数据会影响读取的速度。在直写式缓存中,读取永远不会因为最近编写数据而花费更长时间。在回写高速缓存中,读取可能必须等待高速缓存刷新 - 因此,在写入之后立即读取时间与读取后立即读取可能会给您带来一些有趣的结果。