Следующий фрагмент кода был дан нам от нашего инструктора, чтобы мы могли оценить некоторые алгоритмы производительности:Расчет частоты процессора в C с RDTSC всегда возвращает 0
#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;
}
Однако, мне нужен этот код, чтобы быть портативный машины с различными частотами процессора. Для этого я пытаюсь вычислить частоту процессора машины, где код которая запускается так:
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;
}
Проблема заключается в том, что результат всегда 0, и я не могу понять, почему. Я запускаю Linux (Arch) в качестве гостевого на VMware.
На машине друга (MacBook) это работает в некоторой степени; Я имею в виду, что результат больше 0, но он переменный, потому что частота процессора не фиксирована (мы пытались ее исправить, но по какой-то причине мы не можем этого сделать). У него есть другая машина, на которой работает Linux (Ubuntu) в качестве хоста, и она также сообщает 0. Это исключает проблему на виртуальной машине, которая, по моему мнению, была проблемой в первую очередь.
Любые идеи, почему это происходит и как я могу это исправить?
Хотя вопрос был (немного) другим, большая часть моего ответа на: http : //stackoverflow.com/questions/2658699/measure-time-to-execute-single-instruction/2658833#2658833 применяется здесь. –
@ Jerry Coffin Я не вижу, как ваш ответ на этот вопрос помогает мне. Но чем больше, я не понимал большую часть того, что вы написали lol. –
@Tim Post: Его проблема не в том, что (по крайней мере, исключительно) VMWare - это то, что RDTSC может быть выполнен из строя, поэтому без выполнения команды сериализации (обычно это «CPUID») она дает почти бессмысленные результаты. –