潮声隔雨深 · 2020年04月05日

neon 代码比C代码效率为啥比理论值相差这么大?

尝试翻译一段 图片镜像的代码,neon优化的代码运行时间,只有C代码的一半,但远低于loop循环计算出来的理论值,为什么会有这么大落差??

C代码:

void C_Nv21YSelfMirror(char output,char input,int width,int height)

{

    int i,j=0;

for(j=0; j<height;j++){

int index = j*width;

for(i=0;i<width;i++)
{

*(output+index+i) = *(input+index+width-i-1);

}
}

}

neon代码:

;------------------------------------------------------
; # r0: Ptr to destination data
; # r1: Ptr to source data
; # r2: width count:
; # r3: height count:
Nv21YSelfMirror

      push {R0-R10,LR}
      mov r9,#0 ;i
      mov r10,#0 ;j
      BIC r2,r2,#0x0f ;width /16

mirror_y_lpj

      MLA R6,R10,R2,R1 ;int index = j*width + input_data;
      mov r4,r2 ;width

mirror_y_lpi

      subs r4,r4,#32 ;-32
      add r7,r6,r4 ;0st in_line
      vld1.32 {d0,d1,d2,d3},[r7]
      vrev64.8 d7,d0
     vrev64.8 d6,d1
      vrev64.8 d5,d2
     vrev64.8 d4,d3
     vst1.32 {d4,d5,d6,d7},[r0]!

bne mirror_y_lpi

    add r10,#01
    cmp r10,r3 ;j<height
    blo mirror_y_lpj

mirror_y_ret

     pop {R0-R10,PC}
1 个回答 得票排序 · 时间排序
一知半解 · 2020年04月05日

Neon的代码做了并行计算(例子里是一个循环做32次),有这样高的性能提升也是正常的。

你的回答