Ich habe nocheinmal eine Frage bezüglich Cacheobjekten.
Meine Funktion sieht wie folgt aus:
typedef unsigned int BLOCK; // sind 32 Bit
//typedef uint8_t BLOCK;
//typedef uint16_t BLOCK;
int creatematrixBPB(BLOCK *pos) {
int row, col;
for (row = 0; row < N; row++) {
for(col = 0; col < N; col++) {
if(col&1)
(*pos++) = (BLOCK)1;
else (*pos++) = (BLOCK)0;
}
}
return 0;
}
Alles anzeigen
Vor dem Funktionsaufruf habe ich schon Speicher angefordert:
BLOCK *pos = malloc(N * N * sizeof(BLOCK));
Ich habe die Funktion für verschiedene Blockgrößen getestet. Und dabei folgende Messungen erhalten(für N = 12000)
32 Bit: 0,93 s
16 Bit: 0,56 s
8 Bit: 0,41 s
Nun habe ich den Algorithmus nocheinmal gestartet, wobei ich KEINE Zeigererhöhungen (++pos) eingebaut habe, sondern nur *pos = 1 geschrieben habe.
Dabei habe ich bei einem N von 12000 eine konstante Zeit von 0,34s gemessen.
Jetzt habe ich die Zeit berechnet, die für das Zeigererhöhen draufgeht:
32 Bit: 0,93 s - 0,34 = 0,59
16 Bit: 0,56 s - 0,34 = 0,22
8 Bit: 0,41 s - 0,34 = 0,07
Eine Verdopplung der Blockgröße führt zu ganz grob zu einer Halbierung der Laufzeit?
Kann ich diesen Sachverhalt darüber erklären, dass bei 32 Bit der Cache eher voll ist und mehr Cache nachgeladen werden muss, wodurch mehr Zeit verloren geht als bei den anderen Blockgrößen? (wenn ich vorraussetzen kann, das pos ein Cacheobjekt ist)?
Oder sind die Unterschiede ganz anders zu erklären?
(PS: Mehrfachmessungen wurden durchgeführt und jeweils ein Mittelwert gebildet)