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

Вы должны чередовать их.

У вас больше команд ARM, чем у NEON. ARM является доминирует один выполняет свой код.

Таким образом, инструкции NEON выполняются БЕСПЛАТНО в пределах 6-ти входных границ, если вы их чередовали.

Обратите внимание, что этот бесплатный обед не доступен на более слабых ядрах, таких как CA7.

+0

Я получил довольно много экономии после чередования инструкций. Благодаря! – vikasmk

+0

Хорошая информация. Можете ли вы более подробно описать, как работает механизм, чтобы получить максимальную выгоду? Что вы подразумеваете под «границей 6 записей»? – BitBank

+1

@BitBank После выбора/декодирования команды NEON помещаются в собственную очередь выполнения, длина которой составляет шесть. Если у вас более шести команд ARM подряд, очередь NEON пуста, а NEON переходит в состояние незанятости. Чтобы избежать этого, вы можете чередовать инструкции 5-5. Но нет причин не делать этого в 1-к-1 образом, тем не менее. –

Смежные вопросы