MPS+Ov10


 * a) // Skriv to udgaver af programmet som laver matrix multiplikation på en 400x400 matrice. Kompiler dem med //**

udgave1

code
 * 1) include 
 * 2) include 


 * 1) define NUM 600

int main(void) { double A[NUM][NUM]; double B[NUM][NUM]; double C[NUM][NUM];

int i,j,k; int N = NUM;

for (i=0; i
 * 2) include 


 * 1) define NUM 400

double A[NUM][NUM]; double B[NUM][NUM]; double C[NUM][NUM];

int main(void) { int i,j,k; int N = NUM;

double tmp[N][N];

for (i = 0; i < N; ++i) for (j = 0; j < N; ++j) tmp[i][j] = B[j][i]; for (i = 0; i < N; ++i) for (j = 0; j < N; ++j) for (k = 0; k < N; ++k) C[i][j] += A[i][k] * B[j][k];

return C[N-1][N-1];

} code


 * b) Mål tidsforbruget for udførslen af matrix multiplikationen **

stud@GoldenImage:~/MPS/Opgave10$ time ./matrix

real 0m1.875s

user 0m0.620s

sys 0m1.232s

code
 * c) Kør programmerne med Cachegrind og noter den procentuelle cache-miss: **

4171
D1 miss rate:           1.4% (        1.6%     +        0.0%  )

4171
LLd miss rate:          0.8% (        0.8%     +        0.0%  ) code


 * d) Fortsæt dataopsamlingen med de forskellige optimiserings parametre (Hvad gør de forskellige optimeringer??) Sammenlign resultaterne, er der forskel i performance? Hvad virker bedst og hvorfor? **

1. optimering

code

4295
D1 miss rate:        11.2% (       11.1%     +    21.0%  )

4295
LLd miss rate:        6.2% (        6.2%     +     0.0%  ) code

2.optimering code

4224
D1 miss rate:        11.1% (       11.0%     +    40.2%  )

4224
LLd miss rate:        6.2% (        6.2%     +     0.0%  ) code

3.optimering

code

4212
D1 miss rate:        11.1% (       11.0%     +    40.2%  )

4212
LLd miss rate:        6.2% (        6.2%     +     0.0% code


 * e) Kompiler programmet til target (arm-none-linux-gnueabi-gcc) og eksekvér det herpå med time. **

der opstår en segmentation fault. da stackens størelse på 8192kB bliver overskredet nedenfor kan se ses udskriften. code Segmentation fault

real   0m20.953s user   0m20.854s sys    0m0.076s code