TI中文支持网
TI专业的中文技术问题搜集分享网站

C6748的线性汇编生成的汇编代码,效率不高是什么原因?

各位大神好:

    我在使用C6748,用线性汇编编写一个点积的程序,我完全按照某教材的步骤进行编写,但发现生成的优化汇编代码的效率远远低于教材上面所生成的代码,具体表现在生成的代码并行度不高,有很多NOP操作。甚至跟优化后的C代码相比,还要差很多这是为什么呢?

    原始的线性汇编代码如下:

   

_dotp_asm_result: .cproc a_0, b_0
.reg a_4, b_4, sum0, sum1, I
.reg val1, val2, prod1, prod2
.no_mdep
ADD 4, a_0, a_4
ADD 4, b_0, b_4
MVK 50,I ; I = 100 / 4
ZERO sum0 ; multiply result = 0
ZERO sum1 ; multiply result = 0

.mptr a_0, a+0, 8 ;意义在于避免memory bank conflict, a_0与a_4这两个不会发生BANK confict
.mptr a_4, a+4, 8 ;而a b之间可能会有bank conflict 应该避免
.mptr b_0, b+0, 8
.mptr b_4, b+4, 8

loop: .trip 50
LDW *a_0++[2], val1;
LDW *b_0++[2], val2;
MPY val1, val2, prod1;
MPYH val1, val2, prod2;
ADD prod1, sum0, sum0;
ADD prod2, sum1, sum1;

LDW *a_4++[2], val1;
LDW *b_4++[2], val2;
MPY val1, val2,prod1;
MPYH val1, val2,prod2;
ADD prod1, sum0, sum0
ADD prod2, sum1, sum1

[ I ] ADD -1, I, I
[ I ] B loop
ADD sum0, sum1, A4
.return A4
.endproc

经过汇编优化器后的汇编代码,的流水线核心如下:

  

;* SINGLE SCHEDULED ITERATION
;*
;* $C$C59:
;* 0 LDW .D2T2 *B5++(8),B0 ; |37|;* 1 LDW .D1T1 *A5++(8),A0 ; |38|;* || LDW .D2T2 *B4++(8),B1 ; |45|;* 2 LDW .D1T1 *A4++(8),A0 ; |44|;* 3 NOP 3
;* 6 MPY .M2X B0,A0,B2 ; |39|;* || MPYH .M1X B0,A0,A2 ; |40|;* 7 MPY .M2X A0,B1,B2 ; |46|;* || MPYH .M1X A0,B1,A2 ; |47|;* 8 ADD .L2 B2,B3,B3 ; |41| ^;* || ADD .L1 A2,A1,A1 ; |42| ^;* 9 ADD .L2 B2,B3,B3 ; |48| ^;* || ADD .L1 A2,A1,A1 ; |49| ^;* || SPBR $C$C59
;* 10 ; BRANCHCC OCCURS {$C$C59} ; |52|

而教材上是这样的

L2: ; PIPED LOOP KERNEL
[ B1] SUB .S2 B1,1,B1 ; <0,8>
|| ADD .L2 B9,B5,B9 ; |21| <0,8> ^ sum0 += a[0] * b[0]
|| ADD .L1 A6,A0,A0 ; |22| <0,8> ^ sum1 += a[1] * b[1]
|| MPY .M2X B8,A4,B9 ; |19| <1,6> a[0] * b[0]
|| MPYH .M1X B8,A4,A6 ; |20| <1,6> a[1] * b[1]
|| [ B0] B .S1 L2 ; |32| <2,4> if (!I) goto loop
|| [ B1] LDW .D1T1 *A3++(8),A4 ; |24| <3,2> load a[2-3] bankx+2
|| [ A1] LDW .D2T2 *B6++(8),B8 ; |17| <4,0> load a[0-1] bankx
[ A1] SUB .S1 A1,1,A1 ; <0,9>
|| ADD .L2 B5,B9,B5 ; |28| <0,9> ^ sum0 += a[2] * b[2]
|| ADD .L1 A6,A0,A0 ; |29| <0,9> ^ sum1 += a[3] * b[3]
|| MPY .M2X A4,B7,B5 ; |26| <1,7> a[2] * b[2]
|| MPYH .M1X A4,B7,A6 ; |27| <1,7> a[3] * b[3]
|| [ B0] ADD .S2 -1,B0,B0 ; |31| <3,3> I–
|| [ A1] LDW .D2T2 *B4++(8),B7 ; |25| <4,1> load b[2-3] banky+2
|| [ A1] LDW .D1T1 *A5++(8),A4 ; |18| <4,1> load b[0-1] banky

整个流水线的核,只用了两个执行包就搞定了,请问这是什么原因呢?

Denny%20Yang99373:

看看编译选项,调整-o3参数试试

Wei Hu2:

回复 Denny%20Yang99373:

-o3已经开启

Wei Hu2:

回复 Denny%20Yang99373:

-o3优化选项已经开启,但是发现生成的流水只是单次迭代,而并没有能够使其流水线化

赞(0)
未经允许不得转载:TI中文支持网 » C6748的线性汇编生成的汇编代码,效率不高是什么原因?
分享到: 更多 (0)