我们如何系统地编写代码来将数据加载到我们的L1或L2缓存中?
我特意尝试填充系统的L1 I缓存以进行更高分析。 任何建议都可以 - 关于编写汇编代码或简单的C编程。有关此主题的相关文章将更有帮助。
答案 0 :(得分:3)
缓存存储最近访问的数据。要填充缓存,只需访问数据。或者在这种情况下,说明。使用无操作指令(以及最后的循环分支指令)填充内存块并跳转到它。
棘手的部分是在加载后将数据保存在那里。只要您的基准测试正在运行,您就无法访问32K(或其他)数据集之外的任何内容。
我无法想象你通过人工填充缓存然后保持它填充相同的数据集得到的结果,但是你去了。
答案 1 :(得分:2)
您需要找出CPU和替换策略的缓存关联性。我无法想到这个问题的一般解决方案,它可以在我使用过的所有CPU上运行。即使广告宣传为与LRU替换策略完全关联的缓存也不是现实,并且很难找出完全填充缓存的内存访问模式。
如果你想要一些非常具体的基准测试(由于其他原因这是个坏主意),我建议你试着弄清楚如何刷新缓存。这实际上是可行的。
答案 2 :(得分:0)
我上周刚刚为ECC填充l1和l2缓存执行了此任务。
基本上,如果您有64Kbyte缓存,例如,数据的总数(x路数,y缓存行数等)只是通过缓存线性访问那么多数据(可能需要mmu才能启用缓存)如果可能的话,在一些64K字节的边界上启动并理想地在高速缓存行大小的读取(或多个)中读取64K字节的数据。对于icache,你需要那么多字节的指令(nops或者添加reg + 1或者其他东西),记住最后可能有一个预取,所以你可能不得不退回最后的几条指令,这样预取就需要了你一直到最后(可能需要一些练习,如果你不了解逻辑(芯片SIM卡)那么你可能不会想出来。
你可以使用你的逻辑可能具有的mmu或其他游戏来减少所需的内存量,例如,如果你的mmu的条目大小覆盖了4Kb,那么你可以用数据填充4Kb的真实内存,然后使用16个不同的mmu条目(具有16个不同的虚拟地址),并通过4K读取16个中的每一个。当然,如果您的缓存位于mmu的虚拟地址侧。
总的来说,这是一件很难看的事情,如果你的mmu阻止了指令缓存,你可以把执行测试的代码放在一个非缓存的空间中,这样它就不会弄乱icache而只会用来填充缓存位于缓存的地址空间中。
祝你好运......