Berechnung der CPU-Frequenz in C mit RDTSC liefert immer 0

Der folgende Code wurde uns von unserem Kursleiter zur Verfügung gestellt, damit wir die Leistung einiger Algorithmen messen können:

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

Ich benötige jedoch diesen Code, um auf Maschinen mit unterschiedlichen CPU-Frequenzen portierbar zu sein. Dazu versuche ich, die CPU-Frequenz des Computers zu berechnen, auf dem der Code ausgeführt wird:

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

Das Problem ist, dass das Ergebnis immer 0 ist und ich nicht verstehen kann, warum. Ich verwende Linux (Arch) als Gast auf VMware.

Auf dem Computer eines Freundes (MacBook) funktioniert es bis zu einem gewissen Grad. Ich meine, das Ergebnis ist größer als 0, aber es ist variabel, weil die CPU-Frequenz nicht fest ist (wir haben versucht, es zu beheben, aber aus irgendeinem Grund können wir es nicht tun). Er hat eine andere Maschine, auf der Linux (Ubuntu) als Host ausgeführt wird und die ebenfalls 0 meldet. Dies schließt das Problem auf der virtuellen Maschine aus, von der ich dachte, dass es zuerst das Problem war.

Irgendwelche Ideen, warum dies passiert und wie kann ich es beheben?

Antworten auf die Frage(10)

Ihre Antwort auf die Frage