assembly - x86 操作码对齐引用和指南

标签 assembly x86 x86-64 memory-alignment micro-optimization

我正在 JIT 编译器中动态生成一些操作码,我正在寻找操作码对齐的指南。

1)我已经阅读了通过在调用后添加 nops 来简要“推荐”对齐的评论

2)我还阅读了有关使用 nop 优化并行性序列的信息。

3)我读过操作对齐对“缓存”性能有好处

通常这些评论不提供任何支持性引用。阅读博客或评论说“这样做这样那样是个好主意”是一回事,但实际编写一个编译器来实现特定的操作序列并在线实现大多数 Material ,尤其是博客,这是另一回事用于实际应用。所以我相信自己找出问题(反汇编等,看看现实世界的应用程序做了什么)。这是我需要一些外部信息的一种情况。

我注意到编译器通常会在之前的任何指令序列之后立即启动一个奇字节指令。因此,在大多数情况下,编译器不会特别注意。我在这里或那里看到“nop”,但通常似乎 nop 被谨慎使用,如果有的话。操作码对齐有多重要?您能否提供我可以实际用于实现的案例的引用资料?谢谢。

最佳答案

除了分支目标的对齐之外,我建议不要插入 nops。在某些特定的 CPU 上,分支预测算法可能会惩罚控制传输到控制传输,因此 nop 可能能够充当标志并反转预测,否则它不太可能有帮助。

现代 CPU 会将您的 ISA 操作转换为 micro-ops 反正。这可能会使经典的对齐技术变得不那么重要,因为微操作转码器可能会遗漏 nops 并更改 secret 真实机器操作的大小和对齐方式。

然而,出于同样的原因,基于第一性原理的优化应该几乎没有伤害或没有伤害。

理论是通过在缓存线边界处开始循环来更好地利用缓存。如果循环从缓存行的中间开始,那么缓存行的前半部分将不可避免地被加载并在循环期间保持加载,如果循环长于 1/,这将浪费缓存中的空间2 个缓存行。

此外,对于分支目标,当目标对齐时,缓存线的初始加载加载指令流的最大前向窗口。

关于用 nops 分离不是分支目标的内嵌指令,在现代 CPU 上这样做的原因很少。 (曾经有一段时间 RISC 机器有 delay slots ,这通常导致在控制传输后插入 nops。)对指令流进行解码很容易流水线化,如果架构具有奇数字节长度的操作,您可以请放心,它们已被合理解码。

关于assembly - x86 操作码对齐引用和指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2485721/

相关文章:

linux - IN 指令段错误,内联汇编 GCC

c++ - 操作系统内核错误 : "ld: symbol(s) not found for architecture x86_64"

c - 数组函数参数声明中的静态关键字

gcc - 我可以使用哪些行军/音乐选择?

linux - 汇编 - 将参数传递给函数调用

卡马克在 asm 中的 invsqrt

assembly - x86-64 将 long 转换为 double

linux - 如何创建一个777权限的目录?

c - 汇编语言是如何生成机器码的?

memory - 如何实现/设置数据断点?