Aproveitando os recursos do processador para o contador de ciclos…

No post “Uma pequena correção no código do contador de ciclos” mostrei a versão “final” do contador de ciclos… Infelizmente não é a versão final. A última versão, para arquitetura x86-64, é esta:

;
; Contador de ciclos mais "preciso", de acordo com a 
; latência documentada pelo manual de otimização da Intel.
;
; Forma de uso:
;
;   TSC_READ_START();
;   f();  /* função sob teste. */
;   c = TSC_READ_END();
;
; 'c' conterá a quantidade de ciclos gastos APENAS pela 
; chamada à função 'f'.
;
; Os alinhamentos são usados para não termos fragmentação 
; no cache L1.
;

bits 64

; Este valor é calculado com base na latência das instruções, 
; de acordo com o manual de otimização da Intel.
WASTED_CYCLES equ 12

section .data
; Essas variáveis temporárias não são exportadas!
;
; Declarações equivalentes:
;   static unsigned long count, tmp;
;
        align 16
count:  dq    0
tmp:    dq    0

section .text

global TSC_READ_START:function
global TSC_READ_END:function

  align 16
; Protótipo:
;   void TSC_READ_START(void);
;
TSC_READ_START:
  prefetchw [count]   ; Tenta garantir que as duas variáveis 
                      ; temporárias estejam no cache e prontas
                      ; para serem escritas.
  mov   [rsp+8],ebx
  cpuid
  mov   ebx,[rsp+8]
  rdtsc
  mov   [count],eax   ; 1.5 ciclos
  mov   [count+4],edx ; 1.5 ciclos
  ret                 ; 8 ciclos.

; Protótipo:
;   unsigned long TSC_READ_END(void);
;
  align 16
TSC_READ_END:
                      ; call para essa função toma 1 ciclo.
  rdtscp
  mov   [tmp],eax
  mov   [tmp+4],edx
  mov   [rsp+8],rbx
  cpuid
  mov   rax,[tmp]
  sub   rax,[count]
  sub   rax,WASTED_CYCLES  ; subtrai todos os "13.5" ciclos "extras".

  ; if (rax <= 0)
  ;   rax = 1;
  mov    rbx,1
  cmovle rax,rbx

  mov    rbx,[rsp+8]
  ret

Este código é mais “preciso” que o anterior…

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s