Assembly 分支与内存访问-在AArch64模式下,通常更喜欢什么?
在Cortex-A处理器(AArch64模式)上,是否有一些优化速度的经验法则?好像从内存中读取总是比分支更好 以最简单的十六进制字符串转换为例:Assembly 分支与内存访问-在AArch64模式下,通常更喜欢什么?,assembly,arm64,micro-optimization,Assembly,Arm64,Micro Optimization,在Cortex-A处理器(AArch64模式)上,是否有一些优化速度的经验法则?好像从内存中读取总是比分支更好 以最简单的十六进制字符串转换为例: convert: . . . cmp x9, 9 b.le . + 8 add x9, x9, 0x07 add x9, x9, 0x30 strb w9, [x10, -1]! . . . b convert vs 提前感谢您提供的任何提示。在这个特定示例中,您可以使用csel并同时
convert:
. . .
cmp x9, 9
b.le . + 8
add x9, x9, 0x07
add x9, x9, 0x30
strb w9, [x10, -1]!
. . .
b convert
vs
提前感谢您提供的任何提示。在这个特定示例中,您可以使用
csel
并同时拥有两个方面的优势—无内存读取和无分支。一般来说,我认为答案将在很大程度上取决于这是否是在一个足够紧密的循环中调用的,您可以依靠保留在一级缓存中的查找表,还有条件分支的预测准确度。像这样一个很小的查找表(小于1条缓存线)通常是很好的,特别是当它保存一个不可预测的分支时。如果L1d中很热,即使保存一些指令(如add/csel)也是值得的。尽管需要注意的是,对于这种特定情况,您最好使用SIMD而不是标量循环,从而使用无分支技术,如掩码添加,如在我的x86 SSE2版本中:。或者使用tbl
进行SIMD字节查找,如SSSE3 pshufb版本;我认为AdvSIMD/NEON可以做到这一点。
convert:
. . .
ldrb w9, [x11, x9] ; x11 - ptr to alphabet string: "0123456789ABCDEF"
strb w9, [x10, -1]!
. . .
b convert