按以下流程测L2cache,发现一个现象,请教一下大家。
芯片是xilinx的zynq,L2 size = 512K。
程序本身加载到0x100000。
关闭所有中断。
使能L1和L2。
把0xfc000000开始的512K数据lock到L2中。
反复读写0x140000开始的64K内存。这样,L2虽使能,但却恒定miss,程序能跑890遍/秒。
跑一段时间后,执行DisableL2Cache。程序能跑865遍/秒。
为什么,L2 enable时,即使恒定miss,也比L2 disable 快一些?
你的想法是用0xfc000000开始的数据填充整个L2 cache, 但是你没法完全做到,比如instruction 可能有部分在里面,也许还有部分其它Data。可能对都后面的memcpy带来好处。
可以看一下这两种情况下cache miss有什么不同。
另外PL310支持prefetch。 即使所有的cache被lock, 这个行为依然有效。假如刚好L1 memory sysyem来了数据请求,预取的数据会直接传到L1, 这样有可能对性能有提升。
不好意西,我没说清楚。
该段代码运行在 0~1M,该空间在mmutable中完全禁止cache了,因此L2cache的填充,肯定是有效的。
您的意思是,即使miss,PL310还是会执行prefetch,因此提高了些许速度?
有这个可能性, 具体CPU的行为需要仿真一下才知道。但这样查的话比较耗时间。要是你有ARM 的support服务的话,可以发邮件到support@arm.com