Calcular a frequência da CPU em C com RDTSC sempre retorna 0

O seguinte trecho de código foi fornecido pelo instrutor para que pudéssemos medir o desempenho de alguns algoritmos:

#include <stdio.h>
#include <unistd.h>

static unsigned cyc_hi = 0, cyc_lo = 0;

static void access_counter(unsigned *hi, unsigned *lo) {
    asm("rdtsc; movl %%edx,%0; movl %%eax,%1"
    : "=r" (*hi), "=r" (*lo)
    : /* No input */
    : "%edx", "%eax");
}

void start_counter() {
    access_counter(&cyc_hi, &cyc_lo);
}

double get_counter() {
    unsigned ncyc_hi, ncyc_lo, hi, lo, borrow;
    double result;

    access_counter(&ncyc_hi, &ncyc_lo);

    lo = ncyc_lo - cyc_lo;
    borrow = lo > ncyc_lo;
    hi = ncyc_hi - cyc_hi - borrow;

    result = (double) hi * (1 << 30) * 4 + lo;

    return result;
}

No entanto, preciso que esse código seja portátil para máquinas com diferentes frequências de CPU. Para isso, estou tentando calcular a frequência da CPU da máquina em que o código está sendo executado assim:

int main(void)
{
    double c1, c2;

    start_counter();

    c1 = get_counter();
    sleep(1);
    c2 = get_counter();

    printf("CPU Frequency: %.1f MHz\n", (c2-c1)/1E6);
    printf("CPU Frequency: %.1f GHz\n", (c2-c1)/1E9);

    return 0;
}

O problema é que o resultado é sempre 0 e não consigo entender o porquê. Estou executando o Linux (Arch) como convidado no VMware.

Na máquina de um amigo (MacBook), ela está funcionando até certo ponto; Quero dizer, o resultado é maior que 0, mas é variável porque a frequência da CPU não é fixa (tentamos corrigi-lo, mas, por algum motivo, não conseguimos fazê-lo). Ele tem uma máquina diferente que está executando o Linux (Ubuntu) como host e também reporta 0. Isso exclui o problema da máquina virtual, que eu pensei que fosse o problema a princípio.

Alguma idéia de por que isso está acontecendo e como posso corrigi-lo?

questionAnswers(5)

yourAnswerToTheQuestion