This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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

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