0

根据我的理解,当我们使用 clflush(&Array1[i]) 时,我们实际上是手动逐出这个 Array1[i] 所在的缓存行,并且保证元素 ,Array1[i] 不会出现在缓存和下一个clflush 之后的时间,当我们尝试访问元素 Array1[i] 时,它需要从更高级别的缓存中加载,因此与 clflush 之前的访问时间相比,访问时间更长。

有没有办法检查处理器缓存最近是否被刷新?

用了 81 个刻度

用了 81 个刻度

flush: 花费了 387 个滴答 // 结果如预期

用了 72 个滴答声

现在,假设 Array1[i] 映射到缓存集“P”(W=8,关联方式),所以我假设 Array1 的 8 个元素被加载到同一组“P”的所有 8 个缓存行中。我通过访问 Array1 的其他元素以某种方式将它们加载到 8 个块中。

让其他数组元素 Array2[j]映射到集合“P”的一个块。

这是我的问题,

问题一:

如果我访问 Array2[j] 元素,那么根据我对 LRU 缓存替换策略的理解,Array1 的一个元素将从集合“P”的一个块中被逐出,并将为新元素 Array2[j] 腾出空间,该元素也映射到同一套。这里缓存行/块的选择是根据 LRU 策略确定的。

我对么 ?

问题 2:如果 Array1, 元素从缓存中被逐出以为 Array2[j] 元素腾出空间,它是否会存储在 Victim 缓存中(Array1 和 Array2 都在缓存 L2 中),下一次它将从该受害者中加载缓存或 Array1 元素将从更高的缓存加载,而不是从受害者缓存?

问题3:

如果 Array1 被驱逐为 Array2[j] 元素腾出空间,那么如果我们找到 Array1 元素的访问时间,与访问 Array2[j] 元素之前的访问时间相比,我们是否总是会获得更长的时间?

如果我通过访问 Array2[j] 替换 clflush 命令,这也与 clflush 相同,从该缓存行中刷新 Array1 元素,那么我将得到缓存行的结果,其中 Array1 元素被 Array2[ 的访问替换j]元素

用了 81 个刻度

用了 81 个刻度

****ACCESS ARRAY2[j] 元素:耗时 75 次**

用了 72 个滴答声

**我很困惑,ACCESS ARRAY2[j] 元素:花费了 75 个刻度**** 为什么它更少?什么是正确答案,我期望 Array2 元素驱逐的块的访问时间更长。

我正在使用 Core i7 机器并且在这里使用正确的 rdtsc, 在 i3 或 i7 处理器中使用 clflush()

谁能解释一下,提前谢谢

4

0 回答 0