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.

TMS320F28069F: CLA much slower than CPU for double index array

Part Number: TMS320F28069F

I ran the exact same code on the CLA and the CPU:

    Uint16 CtrStart = EPwm7Regs.TBCTR;
    // Sensor is reverse-connected, positive voltage = negative current
    CurrentMeasurement[1][0] = PhaseCurrentOffset[0] - (((int32)AdcResult.ADCRESULT2)*MotorParameters.CurrentSensRange >> 12);
    CurrentMeasurement[1][1] = PhaseCurrentOffset[1] - (((int32)AdcResult.ADCRESULT3)*MotorParameters.CurrentSensRange >> 12);
    CurrentMeasurement[1][2] = PhaseCurrentOffset[2] - (((int32)AdcResult.ADCRESULT4)*MotorParameters.CurrentSensRange >> 12);
    Uint16 CtrEnd = EPwm7Regs.TBCTR;
    MotorOutputsCla.TempDebug = CtrEnd - CtrStart;

On the CPU, number of cycles in MotorOutputsCla.TempDebug is 37, while on the CLA it is 1100 (!?!).

CurrentMeasurement, PhaseCurrentOffset and MotorParameters.CurrentSensRange are all int32.

Im not very well versed in assembler, this is the listing for the CLA:

130            CurrentMeasurement[1][0] = PhaseCurrentOffset[0] - (((int32)AdcResult.ADCRESULT2)*MotorParameters.CurrentSensRange >> 12);
00009062:    78430000    MMOVIZ     MR3, #0x0
00009064:    78420000    MMOVIZ     MR2, #0x0
128            Uint16 CtrStart = EPwm7Regs.TBCTR;
00009066:    75806984    MMOVZ16    MR0, @0x6984
00009068:    75C08800    MMOV16     @0x8800, MR0
130            CurrentMeasurement[1][0] = PhaseCurrentOffset[0] - (((int32)AdcResult.ADCRESULT2)*MotorParameters.CurrentSensRange >> 12);
0000906a:    75800B02    MMOVZ16    MR0, @0xb02
0000906c:    7BC0003C    MLSL32     MR0, 16
0000906e:    7B80003C    MLSR32     MR0, 16
00009070:    73D0152C    MMOV32     MR1, @0x152c, UNCF
           C$L3:
00009072:    78830001    MMOVXI     MR3, #0x1
00009074:    7C60001F    MAND32     MR3, MR3, MR1
00009076:    7FA00000    MNOP       
00009078:    7FA00000    MNOP       
0000907a:    7FA00000    MNOP       
0000907c:    7981000A    MBCNDD     0xa, EQ
0000907e:    7FA00000    MNOP       
00009080:    7FA00000    MNOP       
00009082:    7FA00000    MNOP       
00009084:    7CC0000A    MADD32     MR2, MR2, MR0
           C$L4:
00009086:    7BC00000    MLSL32     MR0, 1
00009088:    7B800001    MLSR32     MR1, 1
0000908a:    7FA00000    MNOP       
0000908c:    7FA00000    MNOP       
0000908e:    7FA00000    MNOP       
00009090:    7980FFE2    MBCNDD     0xffe2, NEQ
00009092:    7FA00000    MNOP       
00009094:    7FA00000    MNOP       
00009096:    7FA00000    MNOP       
00009098:    7B40002E    MASR32     MR2, 12
0000909a:    73C01542    MMOV32     MR0, @0x1542, UNCF
0000909c:    7CE00020    MSUB32     MR0, MR0, MR2
0000909e:    74C01494    MMOV32     @0x1494, MR0
000090a0:    7FA00000    MNOP       
131            CurrentMeasurement[1][1] = PhaseCurrentOffset[1] - (((int32)AdcResult.ADCRESULT3)*MotorParameters.CurrentSensRange >> 12);
000090a2:    78430000    MMOVIZ     MR3, #0x0
000090a4:    78420000    MMOVIZ     MR2, #0x0
000090a6:    75800B03    MMOVZ16    MR0, @0xb03
000090a8:    7BC0003C    MLSL32     MR0, 16
000090aa:    7B80003C    MLSR32     MR0, 16
000090ac:    73D0152C    MMOV32     MR1, @0x152c, UNCF
           C$L5:
000090ae:    78830001    MMOVXI     MR3, #0x1
000090b0:    7C60001F    MAND32     MR3, MR3, MR1
000090b2:    7FA00000    MNOP       
000090b4:    7FA00000    MNOP       
000090b6:    7FA00000    MNOP       
000090b8:    7981000A    MBCNDD     0xa, EQ
000090ba:    7FA00000    MNOP       
000090bc:    7FA00000    MNOP       
000090be:    7FA00000    MNOP       
000090c0:    7CC0000A    MADD32     MR2, MR2, MR0
           C$L6:
000090c2:    7BC00000    MLSL32     MR0, 1
000090c4:    7B800001    MLSR32     MR1, 1
000090c6:    7FA00000    MNOP       
000090c8:    7FA00000    MNOP       
000090ca:    7FA00000    MNOP       
000090cc:    7980FFE2    MBCNDD     0xffe2, NEQ
000090ce:    7FA00000    MNOP       
000090d0:    7FA00000    MNOP       
000090d2:    7FA00000    MNOP       
000090d4:    7B40002E    MASR32     MR2, 12
000090d6:    73C01544    MMOV32     MR0, @0x1544, UNCF
000090d8:    7CE00020    MSUB32     MR0, MR0, MR2
000090da:    74C01496    MMOV32     @0x1496, MR0
000090dc:    7FA00000    MNOP       
132            CurrentMeasurement[1][2] = PhaseCurrentOffset[2] - (((int32)AdcResult.ADCRESULT4)*MotorParameters.CurrentSensRange >> 12);
000090de:    78430000    MMOVIZ     MR3, #0x0
000090e0:    78420000    MMOVIZ     MR2, #0x0
000090e2:    75800B04    MMOVZ16    MR0, @0xb04
000090e4:    7BC0003C    MLSL32     MR0, 16
000090e6:    7B80003C    MLSR32     MR0, 16
000090e8:    73D0152C    MMOV32     MR1, @0x152c, UNCF
           C$L7:
000090ea:    78830001    MMOVXI     MR3, #0x1
000090ec:    7C60001F    MAND32     MR3, MR3, MR1
000090ee:    7FA00000    MNOP       
000090f0:    7FA00000    MNOP       
000090f2:    7FA00000    MNOP       
000090f4:    7981000A    MBCNDD     0xa, EQ
000090f6:    7FA00000    MNOP       
000090f8:    7FA00000    MNOP       
000090fa:    7FA00000    MNOP       
000090fc:    7CC0000A    MADD32     MR2, MR2, MR0
           C$L8:
000090fe:    7BC00000    MLSL32     MR0, 1
00009100:    7B800001    MLSR32     MR1, 1
00009102:    7FA00000    MNOP       
00009104:    7FA00000    MNOP       
00009106:    7FA00000    MNOP       
00009108:    7980FFE2    MBCNDD     0xffe2, NEQ
0000910a:    7FA00000    MNOP       
0000910c:    7FA00000    MNOP       
0000910e:    7FA00000    MNOP       
00009110:    7B40002E    MASR32     MR2, 12
00009112:    73C01546    MMOV32     MR0, @0x1546, UNCF
00009114:    7CE00020    MSUB32     MR0, MR0, MR2
00009116:    74C01498    MMOV32     @0x1498, MR0
133            Uint16 CtrEnd = EPwm7Regs.TBCTR;
00009118:    73D08800    MMOV32     MR1, @0x8800, UNCF
134            MotorOutputsCla.TempDebug = CtrEnd - CtrStart;
0000911a:    7BC0003D    MLSL32     MR1, 16
0000911c:    7B80003D    MLSR32     MR1, 16
133            Uint16 CtrEnd = EPwm7Regs.TBCTR;
0000911e:    75806984    MMOVZ16    MR0, @0x6984
134            MotorOutputsCla.TempDebug = CtrEnd - CtrStart;
00009120:    7BC0003C    MLSL32     MR0, 16
00009122:    7B80003C    MLSR32     MR0, 16
00009124:    7CE00010    MSUB32     MR0, MR0, MR1
00009126:    7D800000    MI32TOF32  MR0, MR0
00009128:    74C014A4    MMOV32     @0x14a4, MR0

Does anyone has a clue as to what's going on here?

  • Hi,

    Since array indexes are constant, their usage is as fast as usage of nonindexed plain variables. Compile time address of each array element is known and doesn't need to be recalculated at runtime.

    Yes. CLA and CPU are different. The most slow in you snippet is integer multiply. Try replacing it with FP multiply

    Edward

     
  • Thanks a lot. Converting everything to floats got it down to 27 cycles, a 40 fold speed gain.