Calcular la frecuencia de la CPU en C con RDTSC siempre devuelve 0

Nuestro instructor nos dio el siguiente código para que pudiéramos medir el rendimiento de algunos 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;
}

Sin embargo, necesito que este código sea portátil para máquinas con diferentes frecuencias de CPU. Para eso, estoy tratando de calcular la frecuencia de la CPU de la máquina donde se ejecuta el código de esta manera:

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;
}

El problema es que el resultado siempre es 0 y no puedo entender por qué. Estoy ejecutando Linux (Arch) como invitado en VMware.

En la máquina de un amigo (MacBook) funciona hasta cierto punto; Quiero decir, el resultado es mayor que 0 pero es variable porque la frecuencia de la CPU no es fija (tratamos de arreglarlo, pero por alguna razón no podemos hacerlo). Tiene una máquina diferente que ejecuta Linux (Ubuntu) como host y también informa 0. Esto descarta el problema de estar en la máquina virtual, lo que pensé que era el problema al principio.

¿Alguna idea de por qué sucede esto y cómo puedo solucionarlo?

Respuestas a la pregunta(5)

Su respuesta a la pregunta