Ich versuche derzeit das Instruction Timing der CPU auf dem Teens36 Board zu verstehen. Dazu lasse ich kurze Codestücke N mal in einer Schleife ausführen und messe dann mit micros() die Zeit. Dann zeige ich die Zeit in Zyklen pro Durchlauf an. Bei dem Programm unten habe ich folgenden Effekt. Ich lasse zeimal dieselbe Messung laufen. Einmal erhalte ich 7 Zyklen, das zweite mal 6 Zyklen. Wenn ich vor dem ersten Stück Code einen NOP einbaue vertauschen sich die Werte. Es scheint also mit dem Alignment des Codes zusammenzuhängen. Weiss jemand näheres? Wo finde ich Info darüber?
1 | void setup() { |
2 | Serial.begin(115200); |
3 | delay(1000); |
4 | Serial.print("Hello World 1\n"); |
5 | int N=100000 ; |
6 | double fClock=180e6 ; |
7 | int32_t start ; |
8 | int32_t stop ; |
9 | double T ; |
10 | int sum ; |
11 | int x ; |
12 | float fsum ; |
13 | float fx ; |
14 | float fy ; |
15 | // erstes Stück
|
16 | // 7 cycles
|
17 | start=micros() ; |
18 | fsum=0 ; |
19 | fx=1 ; |
20 | fy=2 ; |
21 | for(int k=1 ; k<=N ; k++){ |
22 | fx += 2.0 ; |
23 | fy += 3.0 ; |
24 | fsum += fx*fy ; |
25 | }
|
26 | stop=micros() ; |
27 | Serial.printf("sum=%15.10e\n",fsum) ; |
28 | T=(stop-start)*1e-6 ; |
29 | Serial.printf("test10a %8.2f cycles \n",T/N*fClock) ; |
30 | // zweites Stück
|
31 | // 6 cycles
|
32 | asm volatile ("NOP ; // LOOP-10a\n "); |
33 | start=micros() ; |
34 | fsum=0 ; |
35 | fx=1 ; |
36 | fy=2 ; |
37 | for(int k=1 ; k<=N ; k++){ |
38 | fx += 2.0 ; |
39 | fy += 3.0 ; |
40 | fsum += fx*fy ; |
41 | }
|
42 | stop=micros() ; |
43 | Serial.printf("sum=%15.10e\n",fsum) ; |
44 | T=(stop-start)*1e-6 ; |
45 | Serial.printf("test10b %8.2f cycles \n",T/N*fClock) ; |
46 | }
|
47 | |
48 | void loop(){ |
49 | }
|