K8处理器分支预测失败与rep ret的关联及gcc生成原因咨询
为什么GCC会生成
rep ret指令? - 核心根源是AMD K8架构(早期速龙64系列处理器)的分支预测器存在设计瑕疵:对单字节ret指令(机器码
0xC3)的处理容易出现预测错误。 - ret指令本质是分支跳转:函数执行完毕后要跳回调用者的地址,CPU的分支预测器会记录过往的返回地址,下次遇到ret时直接预判跳转,避免流水线停顿。但K8的预测器在单字节ret处于某些内存对齐位置时,会误判跳转方向,导致分支预测失败。
- 预测失败的影响:CPU必须清空正在执行的流水线,重新从正确地址取指令,这会造成明显的性能损耗。
rep ret的作用:rep前缀(机器码0xF3)原本是给字符串指令用的,但和ret组合时,CPU会直接忽略前缀,执行ret的正常功能——和单字节ret完全一样,都是返回调用者。但关键是rep ret是两字节指令,刚好避开了K8处理器对单字节ret的预测缺陷。- GCC的优化逻辑:为了让编译出的程序在K8这类老架构处理器上也能稳定高效运行,GCC会默认用
rep ret代替单字节ret;哪怕新CPU不需要这个兼容,也不会影响功能(新CPU能正确处理rep ret,性能和单字节ret无差别)。
内容的提问来源于stack exchange,提问作者Michael Coleman
相关产品推荐
相关产品推荐

