PL01_guiao.pdf

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:

Compiler Explorer

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:

  1. Primeiro compilar:

    gcc -O2 -Dsize=128 -std=gnu99 mmult.c

  2. Depois, usar o perf:

    srun --partition=cpar perf stat -r 5 -e instructions,cycles ./a.out

Untitled

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 |