汇编语言如何使具有特定缓存设计的计算机运行得更快?



我是汇编语言和缓存设计的新手,最近我们的教授给了我们一个关于编写汇编语言指令的问题,以使具有特定缓存设计的计算机运行得更快。我不知道如何使用组装来提高性能。我可以得到任何提示吗?

两种缓存设计如下所示:

缓存 A:128 套,2 路集 关联、32 字节块、直写和无写分配。 缓存 B:256 组、直接映射、32 字节块、回写和 写入分配。

问题是:

描述一个小汇编语言程序片段,两条指令 就足够了,这使得计算机 A(使用缓存 A 设计)运行为 尽可能快于计算机 B(使用缓存 B 设计)。

还有另一个问题问相反的问题:

写一点汇编语言程序片段,两条指令是 足够了,这使得计算机 B 的运行速度尽可能快 计算机 A.

要使用直接映射缓存的速度较慢,但使用关联缓存时速度较快,最好的选择可能是 2 次加载1

由于该计算机上的缓存别名而不是另一台计算机上的缓存别名而创建冲突未命中。 即 2 个加载不能在缓存中连续命中,因为它们索引同一集。

假设代码段将在循环中运行,或者在代码段运行之前缓存由于其他原因已经很热。 您可能还可以假设寄存器持有一个有效的指针,该指针相对于 32 字节缓存李边界具有一些已知的对齐方式,即您可以为代码段设置前提条件。


脚注 1:或者可能是存储,但加载未命中更显然需要停止 CPU,因为它们不能被存储缓冲区隐藏。 只有通过记分板才能在实际使用加载结果之前不会停止


为了使直写/无写分配缓存运行缓慢,可以存储然后加载相邻地址或您刚刚存储的地址。 在回写/写分配缓存上,负载将命中。 (但只有在等待存储未命中将数据放入缓存之后。

如果还有具有存储转发功能的存储缓冲区,则在两台计算机上重新加载刚刚存储的相同地址可能会很快。

相同截图的后续运行将获得缓存命中,因为加载将在缓存中分配行。

如果您的机器是具有后增量寻址模式的 CISC,如果您将它们想象成一个循环体,您只需 2 条指令就可以完成更多工作。 目前还不清楚您应该/允许为缓存假设什么样的先决条件。

只需在同一行甚至相同地址的 2 家商店就可以证明直写的成本:使用回写 + 写分配,您将在第二家商店中受到打击。

相关内容

最新更新