2014-09-11 90 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