Loop unrolling-Optimierung, wie funktioniert das

Betrachten dieser C-code:

int sum=0;
for(int i=0;i<5;i++)
    sum+=i;

Könnte dies übersetzt werden in (pseudo-) Montage diese Weise (ohne loop unrolling):

% pseudo-code assembly
ADDI $R10, #0   % sum
ADDI $R11, #0   % i
LOOP:
ADD $R10, $R11
ADDI $R11, #1
BNE $R11, #5 LOOP

Also meine erste Frage ist, wie wird dieser code übersetzt mit loop unrolling, zwischen diesen beiden Möglichkeiten:

1)

ADDI $R10, #0
ADDI $R10, #0
ADDI $R10, #1
ADDI $R10, #2
ADDI $R10, #3
ADDI $R10, #4

2)

   ADD $R10, #10

Ist der compiler optimieren den code und direkt wissen, dass es hat sich zu 10 addieren, ohne die Durchführung aller Summen?

Außerdem ist es eine Möglichkeit zu blockieren, die die pipeline mit einem Sprungbefehl? Muss ich das so geschrieben:

% pseudo-code assembly
ADDI $R10, #0   % sum
ADDI $R11, #0   % i
LOOP:
ADD $R10, $R11
ADDI $R11, #1
NOP   % is this necessary to avoid the pipeline blocking?
NOP
NOP
NOP
BNE $R11, #5 LOOP

Zu vermeiden, dass die fetch-decode-exe-mem-write-back-Zyklus wird unterbrochen durch die Niederlassung?

  • überprüfen Sie kompilierten code.
Schreibe einen Kommentar