3

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

这是我在 GitHub 上的尝试

主要思想是:

  • 如果它的写入,写入时间xx * 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 时,我想知道我是否有一些逻辑错误?

4

1 回答 1

2

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

使用直写高速缓存,X 更高,Y 为零。但是单个循环与多个循环的比率是相同的。因此,您无法区分此过程。

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

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

于 2012-10-05T07:16:52.243 回答