lab3 Report
|Last edited: 2024-12-9
 

Part1:给CPU添加L1D、L1I、L2 Cache

notion image
在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的学习。
 
Loading...