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