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 中的指令调度的主要内容,如果未能解决你的问题,请参考以下文章

从 SSE 到 ARM Neon 的指令转换

ARM NEON:哪对指令必须等待回写?

利用ARM NEON intrinsic优化常用数学运算

ARM NEON 汇编器错误:“指令不能有条件”

如何使用 arm neon 指令右移值

使用 NEON 指令加速级联双二阶 - 它是如何工作的?