J'ai écrit le code d'assemblage du bras v7 pour la fonction c ci-dessous. Mais notre code de montage prend plus de temps comparé au code C. S'il vous plaît quelqu'un peut-il me dire la raison.code d'assemblage de bras prenant plus de temps par rapport à C
int get_maximum_sample_value (short int *inp_frame, int frame_size) {
short int *temp_buff = inp_frame; // Holds the local pointer.
int maximum_value = -1000; // Holds the maximum value.
int abs_value = 0; // Holds the absolute value.
// Get the maximum value of the frame.
for (int index = 0; index < frame_size; ++index) {
abs_value = abs(*temp_buff);
if (maximum_value < abs_value) {
maximum_value = abs_value;
}
++temp_buff;
}
return maximum_value;
}
asm:
.cfi_startproc
push{r4}
ldr r4,LC_P1000 // LC_P1000 = -1000
vdup.s32 q2,r4
cmp r1, #0
beq LP_VD_END
lsrs r4,r1,#2
beq LP_VD_END
LP_VD1:
vldm r0,{d0}
add r0,#8
vmovl.s16 q1,d0
vabs.s32 q1,q1
subs r4, r4, #1
vmax.s32 q2,q1,q2
bne LP_VD1
vmax.s32 d4,d5,d4
vmov r0,s8
vmov r2,s9
cmp r0, r2
it lt
movlt r0, r2
LP_VD_END:
pop{r4}
bx lr
.cfi_endproc
Je n'ai pas vraiment lu votre code mais une chose à garder à l'esprit: Les compilateurs sont "beaucoup" meilleurs pour optimiser le code que les humains –
Vous devriez créer le code source assembleur de sortie du compilateur (tous les compilateurs C que j'ai essayés a cette option) alors vous pouvez le comparer avec votre version asm. –
Qu'est-ce que le compilateur fait mal que vous voyez que vous pouvez faire mieux? Il est souvent possible de battre le compilateur, surtout si vous connaissez la microarchitecture cible et comment l'optimiser. (par exemple pour x86, http://agner.org/optimize/ guide de microarchitecture). Souvent, la sortie 'gcc -O3' est un bon point de départ. Je ne serais pas surpris si votre compilateur a déjà fait un travail décent auto-vectorisation de cette fonction, donc il n'y a peut-être pas grand chose à gagner. Parfois, vous pouvez seulement découper une ou deux instructions, ou resserrer la disposition de branchement. –