いくつかのアルゴリズムのパフォーマンスを測定できるように、インストラクターから次のコードが提供されました。
#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;
}
ただし、このコードを異なる CPU 周波数のマシンに移植できるようにする必要があります。そのために、コードが実行されているマシンの CPU 周波数を次のように計算しようとしています。
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 より大きくなりますが、CPU 周波数が固定されていないため可変です (修正しようとしましたが、何らかの理由で修正できませんでした)。彼は Linux (Ubuntu) をホストとして実行している別のマシンを持っていて、それも 0 を報告しています。
なぜこれが起こっているのか、どうすれば修正できますか?