我想测试先验已知访问模式的预取影响。第一步,我尝试在可执行文件中使用嵌入式汇编程序指令使用预取指令,并在此处找到适当的语法: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0802b/PRFM_imm.html
由对象转储获取的产生的程序集对于这两个L1都是预期的:
0: 340000c1 cbz w1, 18 <_Z8prefetchPhj+0x18>
4: 52800002 mov w2, #0x0 // #0
8: f8a26800 prfm pldl1keep, [x0, x2]
c: 11010042 add w2, w2, #0x40
10: 6b02003f cmp w1, w2
14: 54ffffa8 b.hi 8 <_Z8prefetchPhj+0x8> // b.pmore
和L2:
0: 340000c1 cbz w1, 18 <_Z8prefetchPhj+0x18>
4: 52800002 mov w2, #0x0 // #0
8: f8a26802 prfm pldl2keep, [x0, x2]
c: 11010042 add w2, w2, #0x40
10: 6b02003f cmp w1, w2
14: 54ffffa8 b.hi 8 <_Z8prefetchPhj+0x8> // b.pmore
尽管预取确实可以减少执行时间(在系统仿真模式下使用次要CPU模型),但在两种情况下,输出统计在执行时间和缓存行为方面都是相同的。测试了不同的缓存配置,所有缓存都具有足够的容量来容纳预取的数据(当然,没有硬件预取,并且在确保数据不存在于任何缓存中之后)。根据缓存统计信息,似乎这两条指令都被视为都针对L1缓存。
针对不同的目标级别是否有不同的实现方式,还是gem5以相同的方式执行了两条指令?如果是后者,那么将来的计划中是否包括这样的扩展?