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
交错指令后,我获得了相当多的节省。谢谢! – vikasmk 2014-09-11 08:19:04
更多信息。你能更详细地描述机制如何运作以获得最大利益吗? “6条边界”是什么意思? – BitBank 2014-09-11 15:21:24
@BBBank一旦获取/解码,NEON指令将被放入自己的执行队列中,该队列长度为六个条目。如果连续有超过6条ARM指令,则NEON的队列变空,NEON进入空闲状态。您可以交叉使用5到5的指令来避免这种情况。但是没有理由不以一对一的方式来做到这一点。 – 2014-09-11 23:44:09