lab3 Report
Part1:给CPU添加L1D、L1I、L2 Cache
在config.ini文件中确认system.cpu中children属性存在dcache lcache和l2cache,说明添加成功
运行gemm样例程序,设置max_insts_any_thread 为 5e8,CPU与memory分别为O3与DDR4,与不添加cache的性能进行对比,运行结果如下:
ㅤ | 有Cache | 无Cache |
IPC | 1.182299 | 0.150984 |
可以看到,添加Cache后性能有了明显提高。
Part2:尝试默认的几种Prefetcher
我们给L1D缓存分别添加Stride Prefetcher和AMPM Prefetcher,设置max_insts_any_thread 为 1e9,CPU与memory分别为O3与DDR4,与不添加prefetcher进行对比,运行结果如下:
gemm样例程序:
ㅤ | No Prefetcher | Stride Prefetcher | AMPM Prefetcher |
IPC | 1.182400 | 1.183529 | 3.125727 |
Coverage | / | 0.000002 | 0.983178 |
Accuracy | / | 0.000255 | 0.073765 |
pfLate | / | 9965 | 31154152 |
shell_sort样例程序:
ㅤ | No Prefetcher | Stride Prefetcher | AMPM Prefetcher |
IPC | 0.358294 | 0.392833 | 0.686064 |
Coverage | / | 0.300908 | 0.705973 |
Accuracy | / | 0.074750 | 0.242350 |
pfLate | / | 2998702 | 29891367 |
可以看到,好的Prefetcher对于性能的提升是巨大的
Part3:
设计思路:
使用论文中最朴素的设计:四张表(两个History Table与两个Delta Table)与一个Prefetch Queue。并使用如下参数:
Delta Table与History Table的entry数:256
每条Delta Table中的记录所记录的Delta数:8
每条History Table中的记录所记录的History数:8
degree:4
CONF_THERSHOLD:0.20
并采取论文中所提到的refresh策略,当每条Delta Table中的记录的total_counter达到最大值时将所有local_counter折半。论文中没有提到最大值的取值,这里我尝试使用2000为最大值。
对于latency的计算:设置一个队列 (Cache_Miss_Recorder) 记录每个 demand miss 发生的时间和其对应的PC,如果有不同的 PC 在相同的地址发生了 demand miss,则该 demand miss 的时间戳选用最早发生 demand miss 时的时间戳。同理,设置另一个队列 (Prefetch_fill_Queue) 记录预取请求发生的时间和其对应的PC。
设置样例程序运行的最大指令数为1e9,运行结果如下:
shell_sort样例程序:
ㅤ | StridePrefetcher | AMPMPrefetcher | Lab3Hyperion |
accuracy | 0.300908 | 0.242350 | 0.529129 |
coverage | 0.074750 | 0.705973 | 0.926664 |
IPC | 0.392833 | 0.686064 | 0.939910 |
pfLate | 2998702 | 29891367 | 3407060 |
gemm样例程序:
ㅤ | StridePrefetcher | AMPMPrefetcher | Lab3Hyperion |
accuracy | 0.000255 | 0.073765 | 0.693635 |
coverage | 0.000002 | 0.983178 | 0.967719 |
IPC | 1.183529 | 3.125727 | 3.021975 |
pfLate | 9965 | 31154152 | 1079556 |
可以看到,实现的Lab3Hyperion在shell_sort样例程序上,相较AMPM在全方面有了较大提升。
而在gemm样例程序中,在coverage没有明显下降的情况下,accuracy相比AMPM升高许多,但是IPC却没有AMPM高,这或许是因为AMPM在gemm样例程序上已经基本达到了饱和 (Coverage已经达到了0.98) ,已经很难再获得提升。因此没有必要纠结于这点性能差异。
总的来说,实现的Lab3Hyperion泛用性更广,准确率更高,性能更好。
PS:在gem5的统计数据中,pfLate计算了发出的prefetch request在MSHR中命中的情况,因此,在发送prefetch request时,提前确认该request地址是否在Prefetch Queue中可以显著提高accuracy,即如果该地址已经在Prefetch Queue中就不再发送该预取请求,而是在该已发出的请求中记录当前要发出请求的PC,以便后续对Delta的学习。