研究日誌。

大規模なグラフ処理に対してメモリ階層構造を考慮した高性能なソフトウェアを開発。

動作周波数の取得 - gettimeofday

2010-11-14 22:27:48 | Weblog

すべてのプロセッサのプロセッサ名に MHz が記入されているわけではないので、このように gettimeofday() と rdtsc() を用いて動作周波数を計算する関数を書いてみた。

double get_heuristic_mfreq(void) {
unsigned long a, d;
unsigned long ts1, ts2, td1, td2;
struct timeval tv;

/* heuristic detection */
gettimeofday(&tv, NULL);
td1 = (unsigned long)tv.tv_sec*1000000 + tv.tv_usec;
__asm__ __volatile__ ("rdtsc" : "=a" (a), "=d" (d));
ts1 = a | (d << 32);
usleep(50000); /* 50 msec. */
__asm__ __volatile__ ("rdtsc" : "=a" (a), "=d" (d));
ts2 = a | (d << 32);
gettimeofday(&tv, NULL);
td2 = (unsigned long)tv.tv_sec*1000000 + tv.tv_usec;
/* heuristic detection */

return (double)(ts2-ts1) / (td2-td1);
}