Ein weiterer wesentlicher Fortschritt des Cortex-M7 gegenüber dem Cortex-M4 besteht darin, dass MAC-Operationen statt 2 bis 4 nur noch 1 Taktzyklus benötigen. Multiplikationen und Additionen benötigen dagegen beim M7 genauso wie beim M4 1 oder 2 Taktzyklen abhängig davon, ob das Ergebnis im darauffolgenden Befehl benutzt wird (2 Taktzyklen) oder nicht (1 Taktzyklus).
Die Strategie beim Cortex-M4 kann daher nur lauten, soviele diskrete Additionen oder Multiplikationen wie möglich zu verwenden und diese so anzuordnen, dass Pipeline-Stalls verhindert werden, also ein Ergebnis möglichst mit der nächsten Instruktion nicht genutzt wird.
Beim Cortex-M7 kann der Ansatz dagegen nur lauten, soviele MAC-Operationen wie möglich einzusetzen.
Die Tabelle zeigt wiederum identischen Code einmal für Cortex-M4 und einmal für Cortex-M7 optimiert.
Cortex-M4 | Cortex-M7 |
---|---|
xn1 = pln[0]; | xn1 = pln[0]; |
xn2 = pln[1]; | xn2 = pln[1]; |
xn3 = pln[2]; | xn3 = pln[2]; |
xn4 = pln[3]; | acc1 = b0 * xn1 + d1; |
xn5 = pln[4]; | xn4 = pln[3]; |
xn6 = pln[5]; | d1 = b1 * xn1 + d2; |
xn7 = pln[6]; | xn5 = pln[4]; |
acc1 = b0 * xn1; | d2 = b2 * xn1; |
tmp1 = b1 * xn1; | xn6 = pln[5]; |
acc1 + = d1; | d1 + = a1 * acc1; |
d1 + = d2; | xn7 = pln[6]; |
d2 = b2 * xn1; | d2 + = a2 * acc1; |
tmp1 = d1 * acc1; | |
tmp2 = a2 * acc1; | |
d1 + = tmp1; | |
d2 + = tmp2; |
Beim Cortex-M7 sollte man so oft wie möglich MAC-Operationen einsetzen.