Assembly ARM Profiler显示SMLAxy在Cortex-A9中消耗2个周期。它与技术参考手册相冲突

Assembly ARM Profiler显示SMLAxy在Cortex-A9中消耗2个周期。它与技术参考手册相冲突,assembly,arm,neon,Assembly,Arm,Neon,我发现SMLAxy在ARM profilerARM1176(RVDS 4.0)下消耗1个周期 [ARM1176] 但SMLAxy在Cortex-A9MPx1下消耗2个周期 [CortexA9] 它与Cortex-A9的技术参考手册相冲突: SMULxy、SMLAxy、SMULWy、SMLAWy:周期=1,结果延迟=3 谢谢你提前帮忙 ARM多年来一直在弃用这些“探地雷达中的simd”和信号处理探地雷达指令。在许多armv7实现中,它们被破解或微代码化,或者速度较慢。在armv8中,它们被消除

我发现SMLAxy在ARM profilerARM1176(RVDS 4.0)下消耗1个周期

[ARM1176]

但SMLAxy在Cortex-A9MPx1下消耗2个周期

[CortexA9]

它与Cortex-A9的技术参考手册相冲突:

SMULxy、SMLAxy、SMULWy、SMLAWy:周期=1,结果延迟=3


谢谢你提前帮忙

ARM多年来一直在弃用这些“探地雷达中的simd”和信号处理探地雷达指令。在许多armv7实现中,它们被破解或微代码化,或者速度较慢。在armv8中,它们被消除了,取而代之的是等效的(或更强大的)霓虹灯指令。这基本上是体系结构现代化和精简过程中的一部分。

ARM多年来一直在弃用这些“gpr中的simd”和信号处理gpr指令。在许多armv7实现中,它们被破解或微代码化,或者速度较慢。在armv8中,它们被消除了,取而代之的是等效的(或更强大的)霓虹灯指令。这基本上是建筑现代化和精简过程中的一部分。

这是正确的。SMLAxy在ARMv7上消耗2个周期

然而,重要的是要知道SMULxy只消耗1个周期

假设您通过展开来提高ILP,最好将SMLAxy分为SMULxy和ADD/SUB,因为SMULxy只能通过ALU指令进行双重发布

例如:

loop
ldmia r0!, {r4,r5}
ldmia r1!, {r6,r7}
subs r3, #4
smlabb r9, r4, r6, r14
smlatt r10, r4, r6, r14
smlabb r11, r5, r7, r14
smlatt r12, r5, r7, r14
stmia r2!, {r9-r12}
bgt loop
速度明显慢于:

loop
ldmia r0!, {r4,r5}
ldmia r1!, {r6,r7}
subs r3, #4
smulbb r9, r4, r6
smultt r10, r4, r6
smulbb r11, r5, r7
smultt r12, r5, r7
add  r9, r14
add  r10, r14
add  r11, r14
add  r12, r14
stmia r2!, {r9-r12}
bgt loop
在CA9或以上


但是,在CA8上,由于缺少无序执行功能,您必须手动优化后一个。这是正确的。SMLAxy在ARMv7上消耗2个周期

然而,重要的是要知道SMULxy只消耗1个周期

假设您通过展开来提高ILP,最好将SMLAxy分为SMULxy和ADD/SUB,因为SMULxy只能通过ALU指令进行双重发布

例如:

loop
ldmia r0!, {r4,r5}
ldmia r1!, {r6,r7}
subs r3, #4
smlabb r9, r4, r6, r14
smlatt r10, r4, r6, r14
smlabb r11, r5, r7, r14
smlatt r12, r5, r7, r14
stmia r2!, {r9-r12}
bgt loop
速度明显慢于:

loop
ldmia r0!, {r4,r5}
ldmia r1!, {r6,r7}
subs r3, #4
smulbb r9, r4, r6
smultt r10, r4, r6
smulbb r11, r5, r7
smultt r12, r5, r7
add  r9, r14
add  r10, r14
add  r11, r14
add  r12, r14
stmia r2!, {r9-r12}
bgt loop
在CA9或以上


但是,在CA8上,由于缺少无序执行功能,您必须手动优化后一个。

非常感谢您分享经验。我尝试使用SMULBB和ADD来取代SMLABB。但是反汇编显示SMULBB消耗2个周期。我错过了什么吗?我猜你的工具不准确,或者有联锁问题。非常感谢你分享经验。我尝试使用SMULBB和ADD来取代SMLABB。但是反汇编显示SMULBB消耗2个周期。我错过什么了吗?我猜你的工具不准确,或者是有联锁问题。