ARM NEON 中的指令调度
Posted
技术标签:
【中文标题】ARM NEON 中的指令调度【英文标题】:Instruction scheduling in ARM NEON 【发布时间】:2014-09-11 06:26:35 【问题描述】:如果我的代码执行大约 30 条 ARM 指令,然后执行 20 条 NEON 指令。 NEON 协处理器会因为指令队列有限而停顿到 30 条 ARM 指令完成吗?那么混合使用 ARM 和 NEON 代码会更好吗? 需要注意的是:ARM代码和NEON代码是相互独立的。
.
.
str sl, [sp, #36]
str fp, [sp, #84]
add r8, r8, #1 ; 0x1
lsl r9, r8, r7
sub r9, r9, #1 ; 0x1
ldr sl, [r5, r9, lsl #2]
ldr fp, [r6, r9, lsl #2]
str sl, [sp, #8]
str fp, [sp, #56]
lsl ip, r8, #1
lsl ip, ip, r7
sub ip, ip, #1 ; 0x1
ldr sl, [r5, ip, lsl #2]
ldr fp, [r6, ip, lsl #2]
str sl, [sp, #24]
str fp, [sp, #72]
mov r9, #512 ; 0x200
lsl ip, r8, #1
add ip, ip, r8
lsl ip, ip, r7
sub ip, ip, #1 ; 0x1
cmp ip, #512 ; 0x200
sub r9, r9, #1 ; 0x1
and ip, ip, r9
ldr sl, [r5, ip, lsl #2]
ldr fp, [r6, ip, lsl #2]
rsbge sl, sl, #0 ; 0x
rsbge fp, fp, #0 ; 0x
str sl, [sp, #40]
str fp, [sp, #88]
add r8, r8, #1 ; 0x1
lsl r9, r8, r7
sub r9, r9, #1 ; 0x1
ldr sl, [r5, r9, lsl #2]
ldr fp, [r6, r9, lsl #2]
str sl, [sp, #12]
str fp, [sp, #60]
lsl ip, r8, #1
lsl ip, ip, r7
sub ip, ip, #1 ; 0x1
ldr sl, [r5, ip, lsl #2]
ldr fp, [r6, ip, lsl #2]
str sl, [sp, #28]
str fp, [sp, #76]
mov r9, #512 ; 0x200
lsl ip, r8, #1
add ip, ip, r8
lsl ip, ip, r7
sub ip, ip, #1 ; 0x1
cmp ip, #512 ; 0x200
sub r9, r9, #1 ; 0x1
and ip, ip, r9
ldr sl, [r5, ip, lsl #2]
ldr fp, [r6, ip, lsl #2]
rsbge sl, sl, #0 ; 0x
rsbge fp, fp, #0 ; 0x
str sl, [sp, #44]
str fp, [sp, #92]
add r8, r8, #1 ; 0x1
vshr.s32 q0, q0, #2
vshr.s32 q1, q1, #2
vshr.s32 q2, q2, #2
vshr.s32 q3, q3, #2
vshr.s32 q4, q4, #2
vshr.s32 q5, q5, #2
vshr.s32 q6, q6, #2
vshr.s32 q7, q7, #2
vadd.i32 q8, q0, q4
vadd.i32 q9, q2, q6
vsub.i32 q10, q0, q4
vsub.i32 q11, q2, q6
vadd.i32 q12, q8, q9
vsub.i32 q13, q8, q9
vadd.i32 q8, q1, q5
vsub.i32 q0, q1, q5
vadd.i32 q9, q3, q7
vsub.i32 q1, q3, q7
vsub.i32 q2, q8, q9
vsub.i32 q4, q10, q1
【问题讨论】:
【参考方案1】:你应该把它们交错。
你的 ARM 指令比 NEON 的多。 ARM 是执行您的代码的主导。
因此,如果您交错 NEON 指令,它们将在 6 个条目边界内免费执行。
请注意,这种免费午餐不适用于 CA7 等较弱的内核。
【讨论】:
在交错指令后,我节省了很多钱。谢谢! 好消息。您能否更详细地描述该机制如何发挥最大效益? “6 个条目的边界”是什么意思? @BitBank 获取/解码后,NEON 指令将被放入它自己的执行队列中,该队列有六个条目长。如果连续有超过 6 条 ARM 指令,NEON 的队列就会变空,NEON 会进入空闲状态。您可以交错 5 到 5 的说明来避免这种情况。但是没有理由不以一对一的方式这样做。以上是关于ARM NEON 中的指令调度的主要内容,如果未能解决你的问题,请参考以下文章