domingo, 5 de abril de 2015

Medición perfomance de código

Medición perfomance de código

Para medir el tiempo que tarda la CPU en ejecutar un programa existe la instrucción de marca de Tiempo.

RDTSC

Este instrucción lee un registro de timer tics del procesador y nos devuelve el valor en el registro "RAX" tomando la marca de tiempo al comienzo del programa y restándosela a la marca de tiempo del final del programa obtenemos los tics de reloj que tardo en ejecutarse la subrutina.

La instrucción RDTSCP lee marcas de tiempo y devuelve el identificador de la CPU.
Contador Marca de tiempo
La instrucción RDTSCP carga los 64 bits  en el registro "RAX."
ejemplo
  rdtsc ; lee marca de tiempo
  mov time, eax ; muevo  contador a una variable
  fdiv ; division de punto flotante
rdtsc ; lee marca de tiempo
  sub eax, time ; Calcula la diferencia

Contador Marca de tiempo e Identificador de CPU
La instrucción RDTSCP carga los 64 bits  en el EAX y el idetificado e IA64_TSC_AUX MSR
en el registro RCX
Realiza dos lecturas del RDTSCP las resta y las imprime e imprime el cpu id
Se asembla mediante:

nasm -o print.o -f elf64 -g -F stabs print.asm
gcc -o print print.o

taskset 0x1 ./print ;Se ejecutara en el procesador 0
dbritos@HP:~/asm$ taskset 0x1 ./print
72
0

taskset 0x4 ./print ;Se ejecutara en el procesador 3

Con el comando taskset elijo en que procesador se va a correr la aplicación.

segment .text
EXTERN printf
GLOBAL main
main:
 RDTSCP
 mov rcx,1000000
miloop: mov rbx,rax
;Poner codigo a medir aqui
 RDTSCP
 push rcx
 sub rax,rbx
 mov rsi, rax
 mov rdi, fmt
 mov rax, 0
 call printf
 pop rsi
 mov rdi, fmt
 mov rax, 0
 call printf
 mov rax, 60 ; sys_exit
 mov rdi, 0 ; return 0 (success)
 syscall

segment .data
fmt: db "%d", 10,0


Bibliografia


http://www.intel.com.ar/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf

No hay comentarios:

Publicar un comentario