如何用汇编语言识别缓存未命中或命中?

时间:2019-05-13 08:21:06

标签: assembly cpu-architecture cpu-cache att

考虑一个16KB的直接映射缓存,其块大小为16个字节(4个字)。以下每个汇编程序指令都包含一个内存引用。每个引用都指向一个4字节的字。指令按照给定的顺序执行。

movl $0x11F0, 0x0
movl 0x8, %r8
movl $0x22F0, 0x10000
movl 0x0, %r9
movl $0x33F0, 0x10000

问题在于确定是否正在读取或写入每个指令调用,内存引用是在高速缓存中丢失还是命中,以及是否由于引用高速缓存条目无效或标记不匹配而丢失

我在执行每条指令时都得到以下答案,无论是写还是读,但我不知道如何知道它是错过还是击中?

  1. 存储(写)
  2. 阅读
  3. 商店
  4. 阅读
  5. 商店

本来我应该是1错过,2错过,3错过,4命中,5命中。

此外,在执行完所有指令之后,高速缓存的内容是什么,即对于每个块, 给出其有效性,标签及其内容。

1 个答案:

答案 0 :(得分:0)

除非您设法使用{{1}在周期级别上准确地计时,否则无法确定您的内存访问是否在特定地址上 的明智方法。 },在现代处理器上为does not count cycles anymore

即使您设法在仍会计数周期的CPU上运行代码,即使您需要确保根本不以任何方式或形式中断过程,也可以仍然需要设法过滤掉测量中不可避免的差异。我不想宣称这是不可能的,但是研究和实现无疑是一个巨大的痛苦。

您能做的是找出是否已使用rdtscwindows)或'mprotect'(linux)读取或写入了内存中的特定地址与exceptions结合使用,尽管这只能监视整个页面,而不能监视单个字节。

使用异常的一种替代方法是使用VirtualProtectwindows,我不知道这与Linux等效),但它仅允许监视 writes ,并且仅提供页面大小的粒度。