Este projeto mede o desempenho de operacoes com matrizes e compara execucoes exatas com execucoes aproximadas.
Ele cobre:
- Convolucao 2D com memoria contigua (
conv_linear) - Convolucao 2D com alocacao por linhas (
conv_malloc) - Multiplicacao densa de matrizes blocada (
dgemm) - Versoes aproximadas com reducao de precisao (
float) - Versoes aproximadas com reducao de operacoes (
skip_kerneleskip_k) - Coleta de metricas com
perf - Calculo de erro numerico
- Geracao de graficos para analise experimental
Codigos_Linux/
Makefile
main_linear.c
main_malloc.c
dgemm_blocked.c
conv_linear_approx.c
conv_malloc_approx.c
dgemm_approx.c
run_all.sh
analysis.py
plot_metrics.py
sudo apt update
sudo apt install build-essential linux-tools-common linux-tools-generic python3 python3-pip
pip install pandas matplotlibcd Codigos_Linux
makeExecutaveis gerados:
conv_linear
conv_malloc
dgemm
conv_linear_approx
conv_malloc_approx
dgemm_approx
Para limpar:
make clean./conv_linear <N> <dist> <K> [seed]
./conv_malloc <N> <dist> <K> [seed]Parametros:
N: tamanho da matrizdist:0uniforme,1normal,2exponencialK: tamanho do kernel, positivo, impar e menor ou igual aNseed: semente opcional para reproduzir a mesma entrada
Exemplo:
./conv_linear 512 0 3 12346
./conv_malloc 512 0 3 12346./conv_linear_approx <N> <dist> <K> <approx_type> <seed>
./conv_malloc_approx <N> <dist> <K> <approx_type> <seed>Tipos de aproximacao:
float: executa a convolucao usando precisao simples internamenteskip_kernel: usa apenas parte do kernel e renormaliza os pesos usados
Exemplo:
./conv_linear_approx 512 0 3 float 12346
./conv_malloc_approx 512 0 3 skip_kernel 12346Opcionalmente, os aproximados aceitam um ultimo argumento:
measure: executa apenas a aproximacao, ideal para medir comperfcompare: executa a aproximacao e calcula erro contra a referencia exata
O run_all.sh usa os dois modos automaticamente para evitar que o calculo da referencia exata contamine as metricas do perf.
./dgemm <N> <BS> [seed]Parametros:
N: tamanho da matrizBS: tamanho do blocoseed: semente opcional
Exemplo:
./dgemm 512 32 12346./dgemm_approx <N> <BS> <approx_type> <seed>Tipos de aproximacao:
float: multiplica usando precisao simples internamenteskip_k: reduz operacoes pulando parte do somatorio emk
Exemplo:
./dgemm_approx 512 32 float 12346
./dgemm_approx 512 32 skip_k 12346Assim como nas convolucoes aproximadas, dgemm_approx tambem aceita measure ou compare como ultimo argumento opcional.
chmod +x run_all.sh
sudo ./run_all.shO script executa 10 repeticoes para cada combinacao de:
- Programa
- Tamanho
N - Distribuicao de entrada
- Kernel ou bloco
- Tipo de aproximacao
- Seed padronizada
Ele gera:
resultados.csv
Colunas do CSV:
program,mode,approx_type,N,dist,K,seed,tempo,cycles,instructions,
cache_references,cache_misses,checksum,error_abs_mean,error_rel_mean,
rmse,error_max
Observacao: no dgemm, a coluna K armazena o tamanho do bloco (BS) e dist recebe -.
python3 analysis.pyGera:
resumo_estatistico.csv
O resumo inclui:
- Tempo medio
- Desvio padrao
- IPC medio
- Taxa media de cache miss
- Erro absoluto medio
- Erro relativo medio
- RMSE
- Erro maximo
- Speedup em relacao a versao exata
python3 plot_metrics.pyOs graficos sao salvos em:
results/
Arquivos gerados:
01_tempo_por_N.png
02_speedup_aproximado.png
03_erro_relativo_medio.png
04_erro_vs_speedup.png
05_ipc_por_N.png
06_cache_miss_rate_por_N.png
07_tempo_vs_erro.png
Esses graficos foram pensados para apoiar a discussao do TCC:
- Tempo de execucao por tamanho de matriz
- Ganho de desempenho das aproximacoes
- Erro relativo medio
- Relacao entre erro e speedup
- IPC
- Cache miss rate
- Custo computacional vs erro aproximado
As versoes exatas servem como referencia.
As versoes aproximadas medem o ganho de desempenho aceitando perda numerica controlada. O projeto registra essa troca usando metricas de erro e speedup:
speedup = tempo_exato / tempo_aproximado
Quanto maior o speedup, maior o ganho de desempenho. Quanto menor o erro, mais proximo o resultado aproximado fica da referencia exata.