Øvelse+10+-+EXERCISE+CACHE

Der laves to programmer til at muliplicerer to matricer sammen:

simpelt, uoptimeret:

code format="c" void main {   int mul1[1000][1000]; int mul2[1000][1000]; int res[1000][1000];

for (i = 0; i < N; ++i) for (j = 0; j < N; ++j) for (k = 0; k < N; ++k) res[i][j] += mul1[i][k] * mul2[k][j]; } code

Mere advanced, optimeret: code format="c" void main {	int mul1[100][100]; int mul2[100][100]; int res[100][100];

double tmp[N][N]; for (i = 0; i < N; ++i) for (j = 0; j < N; ++j) tmp[i][j] = mul2[j][i]; for (i = 0; i < N; ++i) for (j = 0; j < N; ++j) for (k = 0; k < N; ++k) res[i][j] += mul1[i][k] * tmp[j][k];

} code

De to programmer køres og kørslestiden noteres

Det simple løsning tog 0,040 Den advancerede løsning tog 0,025 sekunder

Som det ses køres den advancerede løsning hurtigst, dette skyldes at arrayet tilgåes sekventelt, og på den måde undgåes nær så mange misses i cachen.

Problemet med 1000x1000 matricer er at der allokeres mere end man har lov til

Desuden prøvede vi at lade gcc optimerer programmet med -O3 kommandoen.

Uoptimeret real 0m0.016s user 0m0.004s sys 0m0.012s

Optimeret real 0m0.010s user 0m0.000s sys 0m0.012s

Det ses at den optimerede version ikke tager nogen real tid at køre når systemklad sortes fra.