Blend Mode
Alpha
@brunomacabeusbr
@davidsilvam
#ifce
Medição & otimização
O que era mesmo isso aí?
+
=
Objetivo
Medir o tempo, corrente e memória no ARM e PIC &
otimizar o código do ARM
Dificuldades
Medir a memória no ARM
Medir tempo no PIC
Medições
Tempo no PIC com Osciloscópio
Duração de 800ms
Tempo no PIC com TIMER
Duração de 921ms
void interrupcaoAltaPrioridade(void){
if(INTCONbits.TMR0IF){
INTCONbits.TMR0IF = 0;
TMR0H = 0XEA;
TMR0L = 0X65;
tempo();
}
}
void tempo() {
ms3++; //incrementa unidade de milisegundo
if(ms3 >= 10){
ms3 = 0;
ms2++; //incrementa dezena de milisegundo
}
if(ms2 >= 10){
ms2 = 0;
ms1++; //Incrementa centena de milisegundo
}
...
}
int main(){
...
getTime(ini);//Tempo antes de alpha
alpha();
getTime(fim);//Tempo depois de alpha
...
}
Corrente do PIC
Apenas no while true é 28mA
Rodando o algoritimo é 35.3mA
Memória no PIC
7710 bytes usados na memória de programa ( 2211 bytes código )
348 bytes usados na memória de dados
Tempo no ARM
clock_t begin = clock();
// ... código a ser analisado ...
clock_t end = clock();
double time_spent = (end - begin) / ((double) CLOCKS_PER_SEC/1000);
printf("-> %lf miliseconds\n", time_spent);
Duração de 340ms
Corrente no ARM
Apenas com o OS é 345mA
Rodando o algorítimo é 386mA
Memória no ARM
void getMemoryUsed() {
int pagesize = getpagesize();
FILE *pf;
fopen("/proc/self/statm", "r");
if ((pf = fopen("/proc/self/statm", "r")) == NULL) {
printf("Failed to open the proc file\n");
exit(1);
}
unsigned int size = 0; /* Tamanho total do programa */
unsigned int resident = 0; /* Conjunto Residente */
unsigned int share= 0; /* Paginas Compartilhadas (shared pages) */
unsigned int text = 0; /* Codigo do Texto (text code) */
unsigned int lib = 0; /* Biblioteca (library) */
unsigned int data = 0; /* Pilha (data/stack) */
unsigned int dt = 0; /* dirty pages (unused in Linux 2.6) */
fscanf(pf, "%u %u %u %u %u %u", &size, &resident, &share, &text, &lib, &data);
fclose(pf);
printf("\n[size]\t[RSS]\t[share]\t[text]\t[lib]\t[data]\t[dp]\n%u\t%u\t%u\t%u\t%u\t%u\t%u\n",
size, resident, share, text, lib, data, pagesize);
}
O segredo está no /proc/self/statm
E dos dados fornecidos, o mais importate é o RSS
Até 600kb de memória de programa e 304kb de RSS
Otimização da memória no ARM
inicia o algorítimo
joga o mapa de pixels da imagem 1 na memória
análogo ao anterior, mas para a imagem 2
realiza o blend jogando o resultado no sistema de arquivos
fim do algorítimo
Código não otimizado
Código otimizado
inicia o algorítimo
cria ponteiro para o primeiro byte do mapa de pixels da imagem 1 localizado no sistema de arquivos
análogo ao anterior, mas para a imagem 2
realiza o blend jogando o resultado no sistema de arquivos
fim do algorítimo
Resultado
Reduziu em até 36kb o gasto em memória RAM
Duração permaneceu o mesmo: 340 miliseconds
Corrente aumentou 11mA, chegando assim a 397mA
Aprendizado
Como realizar medições de tempo, corrente e memória nas plataformas PIC e ARM
Próximos passos
Otimizar a memória do PIC
Bibliografia
http://man7.org/linux/man-pages/man5/proc.5.html
http://ww1.microchip.com/downloads/en/devicedoc/39632c.pdf
Obrigado
Blend Mode - Otimização
By brunomacabeus
Blend Mode - Otimização
- 777