HP-UX General
1822078 メンバー
3735 オンライン
109640 解決策
新規ポスト

時間測定をCPUサイクル数で行う方法

 
TLSG01
貴重なコントリビューター

時間測定をCPUサイクル数で行う方法

OS:hpux10.20

Model:B2000

C言語のプログラムにおいて

nsec単位で1命令の実行時間を

測定したいのですが

times(),clock()では

10msec単位でしか計測できず

困っています。

CPUのサイクル数(1/CPU周波数)

で計測する命令が有ったような

気がするのですが

ご存じの方はおられますでしょうか?

2件の返信2
nadachi
レギュラーアドバイザー

時間測定をCPUサイクル数で行う方法

struct timeval t1, t2;

として、

 gettimeofday(&t1, (void *)NULL);

....

gettimeofday(&t2, (void *)NULL);

ではさむのではいけませんか? 一応、struct timeval の tv_usec メンバーは ”マイクロ秒" の単位になってますから、ミリ秒よりは細かい。

 ナノ秒まで測る、というのはシステムコールでは難しいでしょう。
nadachi
レギュラーアドバイザー

時間測定をCPUサイクル数で行う方法

移植性はまったくなくなりますが、PA-RISCプロセッサのインターバルタイマレジスタを使う手もあることはあります。例えば、

#include

#include

main()

{

register unsigned long x, y, s;

double ave;

int i;

s = 0;

for (i=0; i<10; i++) {

_MFCTL(16, x);

sleep(1);

_MFCTL(16, y);

s += y - x;

}

ave = (double)s / (double)10;

printf("CR16 1 count = %15.7f nsec.\n",

(double)1.0 / ave * 1000 * 1000 * 1000);

}

として、+DD64 付でコンパイルして (すいません、11.11で試しました。) 実行すると、

$ ./a.out

CR16 1 count = 2.4761232 nsec.

なんて風になります。このマシンでは、インターバルタイマレジスタの1カウントは大体 2.4ナノ秒。

( _MFCTL()はマクロで、中で定義されています。10.20でこのファイルがあるかは分かりません。)

 ただしこの方法は移植性が全然ありません。それと、今度はあまり長い時間 (おそらくミリ秒の

オーダー)を測るのは難しいかも、というのも、あまり長い時間が経過すると、プロセスがCPU間で移動することがある。そうするとCR16の数値比較の意味がなくなりますから。