2014-09-11 87 views
2

如果我有一个代码可以执行大约30条ARM指令,然后执行20条NEON指令。由于有限的指令队列,NEON协处理器会停止运行直到30条ARM指令完成吗?那么混合ARM和NEON代码更好吗? 注意: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 

回答

3

你应该交错它们。

您拥有比NEON更多的ARM指令。 ARM是占主导地位的一个执行您的代码

因此,如果交错,NEON指令会在6个条目边界内免费执行。

请注意,这种免费午餐不适用于CA7等较弱的内核。

+0

交错指令后,我获得了相当多的节省。谢谢! – vikasmk 2014-09-11 08:19:04

+0

更多信息。你能更详细地描述机制如何运作以获得最大利益吗? “6条边界”是什么意思? – BitBank 2014-09-11 15:21:24

+1

@BBBank一旦获取/解码,NEON指令将被放入自己的执行队列中,该队列长度为六个条目。如果连续有超过6条ARM指令,则NEON的队列变空,NEON进入空闲状态。您可以交叉使用5到5的指令来避免这种情况。但是没有理由不以一对一的方式来做到这一点。 – 2014-09-11 23:44:09