当前位置: 首页 > 知识库问答 >
问题:

如何减轻“英特尔jcc勘误表”对gcc的影响?

吕嘉赐
2023-03-14

如果我有一个受“英特尔jcc勘误表”约束的芯片,我如何在gcc中启用缓解措施(调整分支位置以避免出现问题的对齐),以及哪个gcc版本支持它?

共有1个答案

卞安邦
2023-03-14

按编译器:

  • GCC:Wa,-mbranches-within-32B-边界

GNU工具链在汇编器中进行缓解,使用as-mtrands-venin-32B-边界,这使得(GAS手册:x86选项):

  • 恶意分支边界=32(关注32字节边界)。除了手册上说这个选项取指数,而不是2的直接幂,所以很可能它实际上是<代码>。。。边界=5
  • 恶意分支=jcc fused jmp(默认不包括任何调用ret间接
  • 恶意分支前缀大小=5(每个insn最多5个段前缀)

因此,相关的GCC调用是GCC-Wa,-mbranches-within-32B-bounders,不幸的是,GCC-mtune=skylake不能启用此功能。

GAS的策略似乎是在最后一个校准指令(例如,.p2align)之后或在最后一个可在32B边界之前结束的jcc/jmp之后尽早进行pad。我想最终可能会在外部循环中填充,在内部循环之前或之后,可能会帮助它们适应更少的uop缓存线?(Skylake还禁用了LSD循环缓冲区,因此跨两条uop缓存线的微小循环拆分最多可以在每次迭代中运行2个周期,而不是1个周期。)

它可能会导致大量使用长宏融合跳转的填充,例如使用fstack protector strong,最近GCC使用sub-rdx,QWORD PTR fs:0x28(早期GCC使用xor,即使在Intel上也无法融合)。这是子jnz总共11个字节,因此在最坏的情况下可能需要11个字节的CS前缀才能将其移动到新32B块的开头。显示其前面INSN中8个CS前缀的示例:https://godbolt.org/z/n1dYGMdro

GCC不知道指令大小,它只打印文本。这就是为什么它需要气体来支持像<代码>这样的东西。p2align 4,,10如果需要少于10字节的填充,则按16对齐,以实现它想要使用的对齐启发式。(通常后跟.p2align 3以无条件地按8对齐。)

as有其他默认情况下不启用的有趣选项,如优化手写asm的Os,如mov$1,%rax=

也像-msse2avx总是使用VEX前缀,即使助记符不是v...-mfading-as-lock-add=yesmford组装成lock addl$0x0,(%rsp),甚至-Momit-lock-prefix=yes可用于为单处理器系统构建std::atomic代码。

as还具有CPU功能级别检查功能,例如,3月=znver3或。arch指令。和-mtune=CPU,尽管IDK知道它的作用。也许制定NOP策略?

 类似资料:
  • Intel推动微码更新以修复名为“跳转条件码(JCC)勘误表”的错误。由于在某些情况下禁用将代码放入ICache,更新微码导致某些操作效率低下。 标题为“跳转条件代码勘误表的缓解措施”的已发布文档不仅列出了JCC,还列出了:无条件跳转、条件跳转、宏融合条件跳转、调用和返回。 MSVC交换机文档中提到: 在/QIntel jcc勘误表下,编译器检测跨越或终止于32字节边界的跳转指令和宏融合跳转指令。

  • 英特尔建议使用指令前缀来减轻JCC勘误的性能后果。 如果使用QIntel jcc勘误表编译MSVC,则遵循建议,并插入前缀指令,如下所示: 他们说当前缀不可能时,MSVC会求助于NOP。 Clang对此有选项,如果需要,它更喜欢多字节(https://godbolt.org/z/399nc5Msq注意:xchg ax,ax 3E前缀的后果是什么,具体来说: 为什么Intel推荐这一点,而不是多字节

  • Although we have taken every care to ensure the accuracy of our content, mistakes do happen. If you find a mistake in one of our books — maybe a mistake in the text or the code — we would be grateful

  • 用于构建 LFS 系统的软件经常会被更新和加强。在 LFS 指导书发布以后也经常发布新的安全警告和 bug 修正。要检查本书中的软件包版本或者使用的指令是否需要更新或更改以堵上安全漏洞或修正 bug ,请查看这里:http://www.linuxfromscratch.org/lfs/errata/6.2/ 在继续前进之前,你应当将这里的更改应用到这本书相应的地方。

  • 如何使用Java中的Intel AVX矢量指令集?这是一个简单的问题,但答案似乎很难找到。

  • 本人背景算法工程师,cv方向论文两篇,nlp实习经历。 一轮 25min 自我介绍 询问项目论文 问题:resnet架构、c++程序执行过程 反问 二轮 40min 自我介绍 询问项目论文(论文很细致,结构、损失、数据集、实验结果、创新点) 问题:Transformer架构、核心公式以及采用什么的正则化、BN和LN的区别。其实大部分是根据论文内容发散 反问 三轮HR面 25min 没有自我介绍 问