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