ADX指令在llvm-mca中的reciprocal throughput为何与Intel文档不符?
Skylake平台ADX指令llvm-mca建模异常问题解析
- 官方规格与工具分析差异:Intel官方文档明确Skylake平台上ADX系列指令(如
adcxq、adoxq)的吞吐量为0.5 CPI,即每周期可执行2条该类指令;但使用llvm-mca指定Skylake为目标CPU进行分析时,时间线视图显示每周期仅能执行1条ADX指令,与官方规格不符。 - 具体异常表现:在包含
decq和jne的代码序列测试中,标记为[1,0]的adcxq指令被llvm-mca调度到周期3执行,但其依赖的前置计算结果要到周期5才生成,违背了指令执行的依赖规则。 - 根因确认:LLVM社区已定位该问题,根源在于
llvm-mca对EFLAGS寄存器采用了单一建模方式,未区分ADX指令专用的CF/OF标志与其他指令对EFLAGS的影响,导致依赖分析逻辑错误,进而引发吞吐量计算和指令调度的异常。 - 修复方向:通过细化EFLAGS寄存器的建模逻辑,单独跟踪ADX指令涉及的标志位依赖,即可修正该异常,使
llvm-mca的分析结果与Intel官方硬件规格一致。
内容的提问来源于stack exchange,提问作者l4m2
相关产品推荐
相关产品推荐

