我们如何系统地编写代码来将数据加载到我们的L1或L2缓存中?
我特别想针对我的系统填充L1 I缓存以进行一些更高级的分析。任何建议都可以-无论是编写汇编代码还是简单的C编程。关于此主题的相关文章将更加有帮助。
我特别想针对我的系统填充L1 I缓存以进行一些更高级的分析。任何建议都可以-无论是编写汇编代码还是简单的C编程。关于此主题的相关文章将更加有帮助。
缓存存储最近访问的数据。要填充缓存,只需访问数据。或者在这种情况下,访问指令。用无操作指令(以及一个循环分支指令)填充一块内存,然后跳转到它。
棘手的部分是一旦加载了数据,就要保持数据在其中。只要您的基准测试正在运行,就不能访问32K(或其他大小)数据集之外的任何内容。
我无法想象从人工填充缓存并随后使用相同数据集保持其填充的结果会得到什么,但是就是这样。
上周我刚完成了对L1和L2缓存进行ECC填充的任务。
基本上,如果你有一个64K字节的缓存,例如,总共(x个路,y个缓存行等等)对于数据只需通过缓存线性地访问那么多数据(可能需要打开MMU以启用缓存),从某个64K字节边界开始,并理想情况下读取64K字节的数据,如果可能的话,使用缓存行大小的读取(或其倍数)。对于icache,你需要那么多字节的指令(nop或add reg+1之类),记住最后可能会有预取,因此你可能需要向后撤几条指令才能使预取将你带到末尾(这可能需要一些练习,如果你没有逻辑的可见性(芯片模拟),那么你可能找不到解决方法)。
你可以使用MMU或其他游戏逻辑来减少所需的内存量,例如,如果你有一个覆盖4Kb的条目大小的MMU,那么你可以用4Kb的真实内存填充数据,然后使用16个不同的MMU条目(具有16个不同的虚拟地址),并且对于每个16个读取通过4K。当然,这是在你的缓存位于MMU虚拟地址侧的情况下。
总的来说,这种做法有点丑陋,如果你的MMU防止指令缓存,你可以将执行测试的代码放在非缓存空间中,以便它不会干扰ICache,只有用于填充缓存的指令在缓存地址空间中。
祝你好运...