Contando ciclos: Versão final?!

Já publiquei umas 3 versões das minhas macros para contar ciclos de máquina aqui. Essa última parece ser a definitiva.

O que fiz foi retirar as chamadas para as funções built-in __cpuid() e _rdtsc() e substitui por código em assembly puro e simples:

#ifndef __CYCLE_COUNTING_INCLUDED__
#define __CYCLE_COUNTING_INCLUDED__

/* ==========================================
    Quick & Dirty cycle counting...

    START_CYCLE_COUNT() e STOP_CYCLE_COUNT()

    são usadas para contar a quantidade de ciclos
    de máquina gastos num bloco de código.

    Exemplo de uso:

      uint64_t t1, t2;

      START_CYCLE_COUNT(t1);
      f();
      STOP_CYCLE_COUNT(t2);

      // Neste ponto (t2 - t1) conterá a
      // quantidade de ciclos gastos por f().

    É conveniente compilar o código sob teste com a
    opção -O0, já que o compilador poderá 'sumir' com
    o código, por causa da otimização.

    As macros, em si, não são "otimizáveis", por assim dizer.
   ========================================== */

/* Diversas instruções rdtscp para serialização e 'warm up'. */
/* Infelizmente o assembly inline do GCC não permite usar
   a restrição "=A" para atualizar um 'unsigned long long'
   de uma só vez! */
#define START_CYCLE_COUNT(x) \
  { \
    unsigned long lo, hi; \
    \
    __asm__ volatile ( \
      "rdtscp; \
       rdtscp; \
       rdtscp; \
       rdtscp; \
       rdtscp; \
       rdtscp; \
       rdtscp; \
       rdtscp; \
       rdtscp;" \
      : "=a" (lo), "=d" (hi) : : "%ecx" \
    ); \
  \
    (x) = ((unsigned long long)hi << 32) + lo; \
  }

#define STOP_CYCLE_COUNT(x) \
  { \
    unsigned long lo, hi; \
    \
    __asm__ volatile ( \
      "rdtscp;" \
      : "=a" (lo), "=d" (hi) : : "%ecx" \
    ); \
  \
    (x) = ((unsigned long long)hi << 32) + lo; \
  }

#endif
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