完全没有理由为此分配使用汇编。您的解决方案不需要汇编 C 也可以。我假设你在操作系统之上运行,所以这会妨碍你的测量,既执行你认为你知道它们在哪里的事情,也测量你认为你正在测量的东西。
就进行这些测量而言,缓存基础知识......可以说有四层内存。L1,最快,但也是最昂贵和最小的。然后是L2。速度较慢,价格不高,可能比 L1 大。L3 更便宜、更慢、更大,然后是主内存最慢、最便宜和最大。
假设我们有四块内存要使用 A、B、C 和 D。L1 一次只能保存一个块。L2 一次两个,L3 四个中的三个,主内存全部四个。
如果我们进行读取,它首先通过 L1,如果有未命中则通过 L2,如果未命中则通过 L3,如果未命中则它将始终在主存储器中。了解虽然这些数据在返回的路上被缓存,所以 L3、L2 和 L1 都将包含刚刚读取的数据,并在必要时驱逐(并非总是如此,但假设这个简单的缓存模型可以理解如何完成您的任务)。因此,如果我们读取块 A,则 L1、L2 和 L3 都将包含块 A。现在在这个假设模型中,如果我们读取块 B,则 L1 将包含 B,驱逐 A。L2 将包含 A,b 和 l3 将包含 A和 B。读取 C 和 L1 将包含 C,驱逐 B,假设 L2 选择驱逐 A,并包含 B 和 C,并且 L3 包含 A、B 和 C。读取 D 和 L1 将包含 C 假设 L2 驱逐B 并包含 C 和 D,假设 L3 驱逐 A 并包含 B、C 和 D。
假设我们并不确切知道每个缓存如何选择驱逐什么以及保留什么。但是假设我们确实知道或可以从主板规格或其他来源中弄清楚每个缓存有多大。如果上面的例子按这个顺序发生,L1 有 D,L2 有 C 和 D,L3 有 B、C 和 D,而 main 有所有四个 a、b、c、d。然后,如果在该状态下我们读取所有块 A 并且时间它在理论上我们是从主内存中读取它,那么这不仅仅是读取该内存的时间,而且如果任何被驱逐的内存已经改变,它必须一直写到上游可能的命中。但理想情况下,如果您主要只是读取,那么您将主要为读取计时。
假设我们发现自己处于块 D 在 l1 中,c 和 d 在 l2 中,b,c,d 在 l3 中的情况下,我们读取了所有块 B 并对其计时。那不是测量访问 L3 的时间吗?在相同的起始条件下,读取 C 将为我们提供 l2 时间。在相同的起始条件下,读取 D 将是 l1 时间对吗?
诀窍是让自己进入这些条件。缓存的大小可能不会使 l2 是 l1 大小的两倍,依此类推,要完全控制 L1 中的内容,您需要读取足够的数据来填充 L1。此外,如果您要读取 L3 大小的数据量,那么理论上 L3 具有所有数据,L2 具有该数据的最后 L2 量,L1 具有该数据的最后 L1 量。
使用数据缓存比指令缓存更容易,但无论哪种方式都可以,您需要在主存储器中至少有 L3 大小的指令量,大量的 nop。执行线性指令块与读取线性内存块没有什么不同。就读取周期而言。就启用和使用 I 缓存而言,指令更容易。根据您的操作系统和管理内存的方式,启用数据缓存可能会也可能不会简单。