考虑一个16KB的直接映射缓存,其块大小为16个字节(4个字)。以下每个汇编程序指令都包含一个内存引用。每个引用都指向一个4字节的字。指令按照给定的顺序执行。
movl $0x11F0, 0x0
movl 0x8, %r8
movl $0x22F0, 0x10000
movl 0x0, %r9
movl $0x33F0, 0x10000
问题在于确定是否正在读取或写入每个指令调用,内存引用是在高速缓存中丢失还是命中,以及是否由于引用高速缓存条目无效或标记不匹配而丢失
我在执行每条指令时都得到以下答案,无论是写还是读,但我不知道如何知道它是错过还是击中?
本来我应该是1错过,2错过,3错过,4命中,5命中。
此外,在执行完所有指令之后,高速缓存的内容是什么,即对于每个块, 给出其有效性,标签及其内容。
答案 0 :(得分:0)
除非您设法使用{{1}在周期级别上准确地计时,否则无法确定您的内存访问是否在特定地址上 的明智方法。 },在现代处理器上为does not count cycles anymore。
即使您设法在仍会计数周期的CPU上运行代码,即使您需要确保根本不以任何方式或形式中断过程,也可以仍然需要设法过滤掉测量中不可避免的差异。我不想宣称这是不可能的,但是研究和实现无疑是一个巨大的痛苦。
您能做的是找出是否已使用rdtsc
(windows)或'mprotect'(linux)读取或写入了内存中的特定地址与exceptions结合使用,尽管这只能监视整个页面,而不能监视单个字节。
使用异常的一种替代方法是使用VirtualProtect
(windows,我不知道这与Linux等效),但它仅允许监视 writes ,并且仅提供页面大小的粒度。