Das klingt schon mal logisch. Besten Dank.
Ich habe die Reihenfolge der Statements in der Schleife jetzt mal
geändert (siehe unten). Ich dachte ich könnte so einen Strafzyklus
notwendig machen, weil der vfma Befehl jetzt das Resultat des vadd
Befehls vor ihm braucht. Aber der Compiler hat geschickterweise die subs
Instruktion vorgezogen.
1 | int32_t start=micros() ;
|
2 | for(int k=0 ; k<nn ; k++){
|
3 | fy += 1.2 ;
|
4 | fz += 1.3 ;
|
5 | fx += fy * fz ;
|
6 | }
|
7 | int32_t stop=micros() ;
|
8 | /*
|
9 | 50e: ee37 7a06 vadd.f32 s14, s14, s12 1 Zyklus
|
10 | 512: ee77 7aa5 vadd.f32 s15, s15, s11 1 Zyklus
|
11 | 516: 3b01 subs r3, #1 1 Zyklus
|
12 | 518: eee7 6a27 vfma.f32 s13, s14, s15 3 Zyklen
|
13 | 51c: d1f7 bne.n 50e <setup+0x9e> 2 Zyklen
|
14 | */
|
Jetzt verstehe ich folgendes nicht: Meine Laufzeitmessung sagt, dass ein
Schleifendurchlauf 7 Zyklen braucht. Ich komme aber auf 8 Zyklen, wo
mache ich einen Fehler ?