Equação de performance ⇒ Texe = #I x CPI x Tcc ↔ Texe = #CC x Tcc
1.a)
Nesse código tem 3 ciclos aninhados, por cada for → N, logo $O(N^3)$
Se passarmos de matrizes 128x128 para matrizes 256x256: Passamos de N para 2N, logo o tempo aumentará em 8 vezes: 2Nx2Nx2N → $O(8N^3)$ O componente da equação de performance que sera afetado sera o n° de instruções (#I)
1.b)
Neste site podemos ver o código assembly de um código:
A versão -O0 tem mais instruções no assembly.
Dentro do search executar gcc -O0 -S -std=gnu99 mmult.c
e teremos o código assembly.
Contando o n° de instruções temos 44, logo tem $44N^3$ instruções.
$44/8 = 5.5$ de ganho
1.c)
Para medir o n° de instruções e o tempo de execução:
Primeiro compilar:
gcc -O2 -Dsize=128 -std=gnu99 mmult.c
Depois, usar o perf:
srun --partition=cpar perf stat -r 5 -e instructions,cycles ./a.out
Fazendo isso para as restantes opções, temos a tabela:
| | Size | Texe | #CC | #I | #I estimated | Average CPI (calculated) | | --- | --- | --- | --- | --- | --- | --- | | -O2 | 128 | 0,005553 sec | 12’402’436 | 19’635’078 19x10^6 | 8xNxNxN 8x128x128x128 16x10^6 | 0,647 | | -O2 | 256 | 0,051 sec | 125’470’102 | 144’710’313 | 134’217’728 | 0,867 | | -O2 | 512 | 0,409 sec | 1’228’479’846 | 1’112’959’373 | 1’073’741’824 | 1,104 | | -O0 | 512 | 1,017 sec | 3’259’967’247 | 6’087’611’839 | 5’905’580’032 | 0,536 |