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:
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.
dbritos@HP:~/asm$ taskset 0x1 ./print
72
0
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